tactus 0.21.0__tar.gz → 0.21.1__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 (537) hide show
  1. {tactus-0.21.0 → tactus-0.21.1}/.github/workflows/release.yml +2 -2
  2. {tactus-0.21.0 → tactus-0.21.1}/.gitignore +1 -0
  3. {tactus-0.21.0 → tactus-0.21.1}/CHANGELOG.md +31 -5
  4. {tactus-0.21.0 → tactus-0.21.1}/IMPLEMENTATION.md +23 -26
  5. {tactus-0.21.0 → tactus-0.21.1}/PKG-INFO +1 -1
  6. {tactus-0.21.0 → tactus-0.21.1}/SPECIFICATION.md +11 -16
  7. {tactus-0.21.0 → tactus-0.21.1}/TECHNICAL_DEBT.md +14 -19
  8. {tactus-0.21.0 → tactus-0.21.1}/docs/DURABILITY.md +2 -2
  9. {tactus-0.21.0 → tactus-0.21.1}/docs/TOOL_ROADMAP.md +1 -1
  10. {tactus-0.21.0 → tactus-0.21.1}/examples/01-basics-hello-world.tac +1 -1
  11. {tactus-0.21.0 → tactus-0.21.1}/examples/05-basics-multi-model.tac +2 -2
  12. {tactus-0.21.0 → tactus-0.21.1}/examples/06-basics-streaming.tac +1 -1
  13. {tactus-0.21.0 → tactus-0.21.1}/examples/07-basics-bedrock.tac +3 -3
  14. {tactus-0.21.0 → tactus-0.21.1}/examples/08-basics-models.tac +3 -3
  15. {tactus-0.21.0 → tactus-0.21.1}/examples/09-basics-google-gemini.tac +4 -4
  16. {tactus-0.21.0 → tactus-0.21.1}/examples/12-feature-structured-output.tac +17 -21
  17. {tactus-0.21.0 → tactus-0.21.1}/examples/15-feature-local-tools.tac +1 -1
  18. {tactus-0.21.0 → tactus-0.21.1}/examples/16-feature-toolsets-advanced.tac +2 -2
  19. {tactus-0.21.0 → tactus-0.21.1}/examples/17-feature-toolsets-dsl.tac +2 -1
  20. {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-individual.tac +1 -1
  21. {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-inline.tac +1 -1
  22. {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-toolset.tac +1 -1
  23. {tactus-0.21.0 → tactus-0.21.1}/examples/61-inline-toolset-lua.tac +2 -2
  24. {tactus-0.21.0 → tactus-0.21.1}/examples/62-mcp-toolset-by-server.tac +2 -2
  25. {tactus-0.21.0 → tactus-0.21.1}/examples/63-toolset-import-from-file.tac +2 -2
  26. {tactus-0.21.0 → tactus-0.21.1}/examples/99-misc-test-loading.tac +2 -2
  27. {tactus-0.21.0 → tactus-0.21.1}/features/32_result_object.feature +6 -8
  28. {tactus-0.21.0 → tactus-0.21.1}/features/steps/example_procedures_steps.py +5 -0
  29. {tactus-0.21.0 → tactus-0.21.1}/features/steps/result_and_output_steps.py +7 -7
  30. {tactus-0.21.0 → tactus-0.21.1}/pyproject.toml +1 -1
  31. {tactus-0.21.0 → tactus-0.21.1}/tactus/__init__.py +1 -1
  32. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/cli_log.py +25 -0
  33. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/registry.py +1 -0
  34. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/runtime.py +14 -0
  35. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/agent.py +219 -93
  36. tactus-0.21.1/tactus/ide/coding_assistant.py +343 -0
  37. {tactus-0.21.0 → tactus-0.21.1}/tactus/ide/server.py +159 -0
  38. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/__init__.py +2 -0
  39. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/step.py +57 -0
  40. tactus-0.21.1/tactus/primitives/system.py +93 -0
  41. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/__init__.py +7 -0
  42. tactus-0.21.1/tactus/protocols/cost.py +31 -0
  43. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/log_handler.py +2 -2
  44. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/models.py +15 -1
  45. tactus-0.21.1/tactus/protocols/result.py +33 -0
  46. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_agent.py +23 -8
  47. tactus-0.21.1/tactus-ide/frontend/src/components/ChatSidebar.tsx +195 -0
  48. tactus-0.21.1/tests/primitives/test_checkpoint_primitive.py +48 -0
  49. tactus-0.21.1/tests/primitives/test_system_alert.py +73 -0
  50. tactus-0.21.0/tmp/langchain.db/topics_llm_cache.db +0 -0
  51. {tactus-0.21.0 → tactus-0.21.1}/.claude/agents.md +0 -0
  52. {tactus-0.21.0 → tactus-0.21.1}/.github/workflows/desktop-release.yml +0 -0
  53. {tactus-0.21.0 → tactus-0.21.1}/.tactus/config.yml.example +0 -0
  54. {tactus-0.21.0 → tactus-0.21.1}/AGENTS.md +0 -0
  55. {tactus-0.21.0 → tactus-0.21.1}/LICENSE +0 -0
  56. {tactus-0.21.0 → tactus-0.21.1}/Makefile +0 -0
  57. {tactus-0.21.0 → tactus-0.21.1}/README.md +0 -0
  58. {tactus-0.21.0 → tactus-0.21.1}/SPECIFICATION.md.bak +0 -0
  59. {tactus-0.21.0 → tactus-0.21.1}/behave.ini +0 -0
  60. {tactus-0.21.0 → tactus-0.21.1}/docs/AGENTS.md +0 -0
  61. {tactus-0.21.0 → tactus-0.21.1}/docs/BDD_TESTING.md +0 -0
  62. {tactus-0.21.0 → tactus-0.21.1}/docs/CONFIGURATION.md +0 -0
  63. {tactus-0.21.0 → tactus-0.21.1}/docs/FILE_IO.md +0 -0
  64. {tactus-0.21.0 → tactus-0.21.1}/docs/SANDBOXING.md +0 -0
  65. {tactus-0.21.0 → tactus-0.21.1}/docs/STREAMING.md +0 -0
  66. {tactus-0.21.0 → tactus-0.21.1}/docs/TOOLS.md +0 -0
  67. {tactus-0.21.0 → tactus-0.21.1}/examples/.tactus/config.yml +0 -0
  68. {tactus-0.21.0 → tactus-0.21.1}/examples/02-basics-simple-logic.tac +0 -0
  69. {tactus-0.21.0 → tactus-0.21.1}/examples/03-basics-parameters.tac +0 -0
  70. {tactus-0.21.0 → tactus-0.21.1}/examples/04-basics-simple-agent.tac +0 -0
  71. {tactus-0.21.0 → tactus-0.21.1}/examples/10-feature-state.tac +0 -0
  72. {tactus-0.21.0 → tactus-0.21.1}/examples/11-feature-message-history.tac +0 -0
  73. {tactus-0.21.0 → tactus-0.21.1}/examples/13-feature-session.tac +0 -0
  74. {tactus-0.21.0 → tactus-0.21.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
  75. {tactus-0.21.0 → tactus-0.21.1}/examples/14-feature-per-turn-tools.tac +0 -0
  76. {tactus-0.21.0 → tactus-0.21.1}/examples/19-feature-direct-tool-calls.tac +0 -0
  77. {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac +0 -0
  78. {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak +0 -0
  79. {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak2 +0 -0
  80. {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac +0 -0
  81. {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak +0 -0
  82. {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak2 +0 -0
  83. {tactus-0.21.0 → tactus-0.21.1}/examples/30-eval-simple.tac +0 -0
  84. {tactus-0.21.0 → tactus-0.21.1}/examples/31-eval-demo.tac +0 -0
  85. {tactus-0.21.0 → tactus-0.21.1}/examples/32-eval-success-rate.tac +0 -0
  86. {tactus-0.21.0 → tactus-0.21.1}/examples/33-eval-thresholds.tac +0 -0
  87. {tactus-0.21.0 → tactus-0.21.1}/examples/34-eval-dataset.jsonl +0 -0
  88. {tactus-0.21.0 → tactus-0.21.1}/examples/34-eval-dataset.tac +0 -0
  89. {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac +0 -0
  90. {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac.bak +0 -0
  91. {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac.bak2 +0 -0
  92. {tactus-0.21.0 → tactus-0.21.1}/examples/36-eval-advanced.tac +0 -0
  93. {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac +0 -0
  94. {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak +0 -0
  95. {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
  96. {tactus-0.21.0 → tactus-0.21.1}/examples/39-model-simple.tac +0 -0
  97. {tactus-0.21.0 → tactus-0.21.1}/examples/40-mcp-test.tac +0 -0
  98. {tactus-0.21.0 → tactus-0.21.1}/examples/40-model-text-classifier.tac +0 -0
  99. {tactus-0.21.0 → tactus-0.21.1}/examples/41-mcp-simple.tac +0 -0
  100. {tactus-0.21.0 → tactus-0.21.1}/examples/41-model-pytorch.tac +0 -0
  101. {tactus-0.21.0 → tactus-0.21.1}/examples/43-sub-procedure-simple.tac +0 -0
  102. {tactus-0.21.0 → tactus-0.21.1}/examples/44-sub-procedure-composition.tac +0 -0
  103. {tactus-0.21.0 → tactus-0.21.1}/examples/45-sub-procedure-recursive.tac +0 -0
  104. {tactus-0.21.0 → tactus-0.21.1}/examples/46-checkpoint-explicit.tac +0 -0
  105. {tactus-0.21.0 → tactus-0.21.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
  106. {tactus-0.21.0 → tactus-0.21.1}/examples/48-script-mode-simple.tac +0 -0
  107. {tactus-0.21.0 → tactus-0.21.1}/examples/50-inputs-showcase.tac +0 -0
  108. {tactus-0.21.0 → tactus-0.21.1}/examples/51-inputs-calculator.tac +0 -0
  109. {tactus-0.21.0 → tactus-0.21.1}/examples/52-file-io-basics.tac +0 -0
  110. {tactus-0.21.0 → tactus-0.21.1}/examples/53-tsv-file-io.tac +0 -0
  111. {tactus-0.21.0 → tactus-0.21.1}/examples/54-json-file-io.tac +0 -0
  112. {tactus-0.21.0 → tactus-0.21.1}/examples/55-parquet-file-io.tac +0 -0
  113. {tactus-0.21.0 → tactus-0.21.1}/examples/56-hdf5-file-io.tac +0 -0
  114. {tactus-0.21.0 → tactus-0.21.1}/examples/57-excel-file-io.tac +0 -0
  115. {tactus-0.21.0 → tactus-0.21.1}/examples/58-text-file-io.tac +0 -0
  116. {tactus-0.21.0 → tactus-0.21.1}/examples/60-tool-sources.tac +0 -0
  117. {tactus-0.21.0 → tactus-0.21.1}/examples/64-require-modules.tac +0 -0
  118. {tactus-0.21.0 → tactus-0.21.1}/examples/65-optional-state-demo.tac +0 -0
  119. {tactus-0.21.0 → tactus-0.21.1}/examples/70-mocking-static.tac +0 -0
  120. {tactus-0.21.0 → tactus-0.21.1}/examples/71-mocking-temporal.tac +0 -0
  121. {tactus-0.21.0 → tactus-0.21.1}/examples/72-mocking-conditional.tac +0 -0
  122. {tactus-0.21.0 → tactus-0.21.1}/examples/README.md +0 -0
  123. {tactus-0.21.0 → tactus-0.21.1}/examples/app_config.ini +0 -0
  124. {tactus-0.21.0 → tactus-0.21.1}/examples/data/sample.csv +0 -0
  125. {tactus-0.21.0 → tactus-0.21.1}/examples/demo_output.json +0 -0
  126. {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/math_module.tac +0 -0
  127. {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/product.tac +0 -0
  128. {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/string_module.tac +0 -0
  129. {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/sum.tac +0 -0
  130. {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/text_tools.tac +0 -0
  131. {tactus-0.21.0 → tactus-0.21.1}/examples/inventory_summary.tsv +0 -0
  132. {tactus-0.21.0 → tactus-0.21.1}/examples/mock-config.json +0 -0
  133. {tactus-0.21.0 → tactus-0.21.1}/examples/models/README.md +0 -0
  134. {tactus-0.21.0 → tactus-0.21.1}/examples/models/create_sentiment_model.py +0 -0
  135. {tactus-0.21.0 → tactus-0.21.1}/examples/output_summary.txt +0 -0
  136. {tactus-0.21.0 → tactus-0.21.1}/examples/tools/calculations.py +0 -0
  137. {tactus-0.21.0 → tactus-0.21.1}/examples/tools/data_analysis.py +0 -0
  138. {tactus-0.21.0 → tactus-0.21.1}/examples/tools/search.py +0 -0
  139. {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/README.md +0 -0
  140. {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/simple_http_test.tac +0 -0
  141. {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/time_lookup.tac +0 -0
  142. {tactus-0.21.0 → tactus-0.21.1}/features/01_state_management.feature +0 -0
  143. {tactus-0.21.0 → tactus-0.21.1}/features/02_checkpointing.feature +0 -0
  144. {tactus-0.21.0 → tactus-0.21.1}/features/03_human_in_the_loop.feature +0 -0
  145. {tactus-0.21.0 → tactus-0.21.1}/features/04_control_flow.feature +0 -0
  146. {tactus-0.21.0 → tactus-0.21.1}/features/05_tool_integration.feature +0 -0
  147. {tactus-0.21.0 → tactus-0.21.1}/features/06_retry_logic.feature +0 -0
  148. {tactus-0.21.0 → tactus-0.21.1}/features/07_file_operations.feature +0 -0
  149. {tactus-0.21.0 → tactus-0.21.1}/features/08_agent_primitives.feature +0 -0
  150. {tactus-0.21.0 → tactus-0.21.1}/features/09_workflow_execution.feature +0 -0
  151. {tactus-0.21.0 → tactus-0.21.1}/features/10_lua_integration.feature +0 -0
  152. {tactus-0.21.0 → tactus-0.21.1}/features/11_storage_backends.feature +0 -0
  153. {tactus-0.21.0 → tactus-0.21.1}/features/12_json_operations.feature +0 -0
  154. {tactus-0.21.0 → tactus-0.21.1}/features/13_logging.feature +0 -0
  155. {tactus-0.21.0 → tactus-0.21.1}/features/14_stage_and_step_tracking.feature +0 -0
  156. {tactus-0.21.0 → tactus-0.21.1}/features/15_procedure_calls.feature +0 -0
  157. {tactus-0.21.0 → tactus-0.21.1}/features/16_session_management.feature +0 -0
  158. {tactus-0.21.0 → tactus-0.21.1}/features/17_lua_dsl_validation.feature +0 -0
  159. {tactus-0.21.0 → tactus-0.21.1}/features/18_example_procedures.feature +0 -0
  160. {tactus-0.21.0 → tactus-0.21.1}/features/19_ide_server.feature +0 -0
  161. {tactus-0.21.0 → tactus-0.21.1}/features/20_parameters.feature +0 -0
  162. {tactus-0.21.0 → tactus-0.21.1}/features/21_outputs.feature +0 -0
  163. {tactus-0.21.0 → tactus-0.21.1}/features/23_prompts.feature +0 -0
  164. {tactus-0.21.0 → tactus-0.21.1}/features/24_bdd_specifications.feature +0 -0
  165. {tactus-0.21.0 → tactus-0.21.1}/features/25_bdd_custom_steps.feature +0 -0
  166. {tactus-0.21.0 → tactus-0.21.1}/features/26_bdd_evaluation.feature +0 -0
  167. {tactus-0.21.0 → tactus-0.21.1}/features/27_default_settings.feature +0 -0
  168. {tactus-0.21.0 → tactus-0.21.1}/features/28_custom_prompts.feature +0 -0
  169. {tactus-0.21.0 → tactus-0.21.1}/features/29_execution_settings.feature +0 -0
  170. {tactus-0.21.0 → tactus-0.21.1}/features/30_session_filters.feature +0 -0
  171. {tactus-0.21.0 → tactus-0.21.1}/features/31_matchers.feature +0 -0
  172. {tactus-0.21.0 → tactus-0.21.1}/features/33_output_type.feature +0 -0
  173. {tactus-0.21.0 → tactus-0.21.1}/features/42_model_primitive.feature +0 -0
  174. {tactus-0.21.0 → tactus-0.21.1}/features/43_sub_procedure_checkpointing.feature +0 -0
  175. {tactus-0.21.0 → tactus-0.21.1}/features/46_explicit_checkpoint.feature +0 -0
  176. {tactus-0.21.0 → tactus-0.21.1}/features/48_script_mode.feature +0 -0
  177. {tactus-0.21.0 → tactus-0.21.1}/features/51_dspy_lm_config.feature +0 -0
  178. {tactus-0.21.0 → tactus-0.21.1}/features/52_dspy_signature.feature +0 -0
  179. {tactus-0.21.0 → tactus-0.21.1}/features/53_dspy_module.feature +0 -0
  180. {tactus-0.21.0 → tactus-0.21.1}/features/54_dspy_history.feature +0 -0
  181. {tactus-0.21.0 → tactus-0.21.1}/features/55_dspy_prediction.feature +0 -0
  182. {tactus-0.21.0 → tactus-0.21.1}/features/56_dspy_agent.feature +0 -0
  183. {tactus-0.21.0 → tactus-0.21.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  184. {tactus-0.21.0 → tactus-0.21.1}/features/documentation/Lua DSL/README.md +0 -0
  185. {tactus-0.21.0 → tactus-0.21.1}/features/environment.py +0 -0
  186. {tactus-0.21.0 → tactus-0.21.1}/features/steps/agent_primitives_steps.py +0 -0
  187. {tactus-0.21.0 → tactus-0.21.1}/features/steps/checkpointing_steps.py +0 -0
  188. {tactus-0.21.0 → tactus-0.21.1}/features/steps/control_flow_steps.py +0 -0
  189. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_agent_steps.py +0 -0
  190. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_history_steps.py +0 -0
  191. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_lm_steps.py +0 -0
  192. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_module_steps.py +0 -0
  193. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_prediction_steps.py +0 -0
  194. {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_signature_steps.py +0 -0
  195. {tactus-0.21.0 → tactus-0.21.1}/features/steps/file_operations_steps.py +0 -0
  196. {tactus-0.21.0 → tactus-0.21.1}/features/steps/human_in_the_loop_steps.py +0 -0
  197. {tactus-0.21.0 → tactus-0.21.1}/features/steps/ide_server_steps.py +0 -0
  198. {tactus-0.21.0 → tactus-0.21.1}/features/steps/json_operations_steps.py +0 -0
  199. {tactus-0.21.0 → tactus-0.21.1}/features/steps/logging_steps.py +0 -0
  200. {tactus-0.21.0 → tactus-0.21.1}/features/steps/lua_dsl_validation_steps.py +0 -0
  201. {tactus-0.21.0 → tactus-0.21.1}/features/steps/lua_integration_steps.py +0 -0
  202. {tactus-0.21.0 → tactus-0.21.1}/features/steps/mocking_steps.py +0 -0
  203. {tactus-0.21.0 → tactus-0.21.1}/features/steps/procedure_calls_steps.py +0 -0
  204. {tactus-0.21.0 → tactus-0.21.1}/features/steps/retry_logic_steps.py +0 -0
  205. {tactus-0.21.0 → tactus-0.21.1}/features/steps/session_management_steps.py +0 -0
  206. {tactus-0.21.0 → tactus-0.21.1}/features/steps/stage_tracking_steps.py +0 -0
  207. {tactus-0.21.0 → tactus-0.21.1}/features/steps/state_management_steps.py +0 -0
  208. {tactus-0.21.0 → tactus-0.21.1}/features/steps/storage_backend_steps.py +0 -0
  209. {tactus-0.21.0 → tactus-0.21.1}/features/steps/support/__init__.py +0 -0
  210. {tactus-0.21.0 → tactus-0.21.1}/features/steps/support/harnesses.py +0 -0
  211. {tactus-0.21.0 → tactus-0.21.1}/features/steps/tool_integration_steps.py +0 -0
  212. {tactus-0.21.0 → tactus-0.21.1}/features/steps/workflow_execution_steps.py +0 -0
  213. {tactus-0.21.0 → tactus-0.21.1}/scripts/audit_examples_mocking.py +0 -0
  214. {tactus-0.21.0 → tactus-0.21.1}/scripts/convert_examples.py +0 -0
  215. {tactus-0.21.0 → tactus-0.21.1}/start-web-ide.sh +0 -0
  216. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/__init__.py +0 -0
  217. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/cli_hitl.py +0 -0
  218. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/file_storage.py +0 -0
  219. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/http_callback_log.py +0 -0
  220. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/ide_log.py +0 -0
  221. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/lua_tools.py +0 -0
  222. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/mcp.py +0 -0
  223. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/mcp_manager.py +0 -0
  224. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/memory.py +0 -0
  225. {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/plugins.py +0 -0
  226. {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/http_backend.py +0 -0
  227. {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/model_backend.py +0 -0
  228. {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/pytorch_backend.py +0 -0
  229. {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/__init__.py +0 -0
  230. {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/app.py +0 -0
  231. {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/commands/__init__.py +0 -0
  232. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/__init__.py +0 -0
  233. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/config_manager.py +0 -0
  234. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dependencies/__init__.py +0 -0
  235. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dependencies/registry.py +0 -0
  236. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dsl_stubs.py +0 -0
  237. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/exceptions.py +0 -0
  238. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/execution_context.py +0 -0
  239. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/lua_sandbox.py +0 -0
  240. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/message_history_manager.py +0 -0
  241. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/mocking.py +0 -0
  242. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/output_validator.py +0 -0
  243. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/template_resolver.py +0 -0
  244. {tactus-0.21.0 → tactus-0.21.1}/tactus/core/yaml_parser.py +0 -0
  245. {tactus-0.21.0 → tactus-0.21.1}/tactus/docker/Dockerfile +0 -0
  246. {tactus-0.21.0 → tactus-0.21.1}/tactus/docker/entrypoint.sh +0 -0
  247. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/__init__.py +0 -0
  248. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/config.py +0 -0
  249. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/history.py +0 -0
  250. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/module.py +0 -0
  251. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/prediction.py +0 -0
  252. {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/signature.py +0 -0
  253. {tactus-0.21.0 → tactus-0.21.1}/tactus/ide/__init__.py +0 -0
  254. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/control.py +0 -0
  255. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/file.py +0 -0
  256. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/handles.py +0 -0
  257. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/human.py +0 -0
  258. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/json.py +0 -0
  259. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/log.py +0 -0
  260. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/message_history.py +0 -0
  261. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/model.py +0 -0
  262. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/procedure.py +0 -0
  263. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/procedure_callable.py +0 -0
  264. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/retry.py +0 -0
  265. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/session.py +0 -0
  266. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/stage.py +0 -0
  267. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/state.py +0 -0
  268. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/tool.py +0 -0
  269. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/tool_handle.py +0 -0
  270. {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/toolset.py +0 -0
  271. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/chat_recorder.py +0 -0
  272. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/config.py +0 -0
  273. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/hitl.py +0 -0
  274. {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/storage.py +0 -0
  275. {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/__init__.py +0 -0
  276. {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/base.py +0 -0
  277. {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/bedrock.py +0 -0
  278. {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/google.py +0 -0
  279. {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/openai.py +0 -0
  280. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/__init__.py +0 -0
  281. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/config.py +0 -0
  282. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/container_runner.py +0 -0
  283. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/docker_manager.py +0 -0
  284. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/entrypoint.py +0 -0
  285. {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/protocol.py +0 -0
  286. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/__init__.py +0 -0
  287. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/__init__.py +0 -0
  288. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/csv.py +0 -0
  289. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/excel.py +0 -0
  290. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/file.py +0 -0
  291. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/hdf5.py +0 -0
  292. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/json.py +0 -0
  293. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/parquet.py +0 -0
  294. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/tsv.py +0 -0
  295. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/loader.py +0 -0
  296. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
  297. {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
  298. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/README.md +0 -0
  299. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/__init__.py +0 -0
  300. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/behave_integration.py +0 -0
  301. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/context.py +0 -0
  302. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/eval_models.py +0 -0
  303. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/evaluation_runner.py +0 -0
  304. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/evaluators.py +0 -0
  305. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/events.py +0 -0
  306. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/gherkin_parser.py +0 -0
  307. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_dependencies.py +0 -0
  308. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_hitl.py +0 -0
  309. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_registry.py +0 -0
  310. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_tools.py +0 -0
  311. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/models.py +0 -0
  312. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/pydantic_eval_runner.py +0 -0
  313. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/__init__.py +0 -0
  314. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/builtin.py +0 -0
  315. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/custom.py +0 -0
  316. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/registry.py +0 -0
  317. {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/test_runner.py +0 -0
  318. {tactus-0.21.0 → tactus-0.21.1}/tactus/tracing/__init__.py +0 -0
  319. {tactus-0.21.0 → tactus-0.21.1}/tactus/tracing/trace_manager.py +0 -0
  320. {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/__init__.py +0 -0
  321. {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/cost_calculator.py +0 -0
  322. {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/model_pricing.py +0 -0
  323. {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/safe_file_library.py +0 -0
  324. {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/safe_libraries.py +0 -0
  325. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/LuaLexerBase.py +0 -0
  326. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/LuaParserBase.py +0 -0
  327. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/README.md +0 -0
  328. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/__init__.py +0 -0
  329. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/error_listener.py +0 -0
  330. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.interp +0 -0
  331. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.py +0 -0
  332. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
  333. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
  334. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.interp +0 -0
  335. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.py +0 -0
  336. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.tokens +0 -0
  337. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParserBase.py +0 -0
  338. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  339. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/__init__.py +0 -0
  340. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  341. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
  342. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/semantic_visitor.py +0 -0
  343. {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/validator.py +0 -0
  344. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/.gitignore +0 -0
  345. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/README.md +0 -0
  346. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
  347. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  348. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/backend/hook-lupa.py +0 -0
  349. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/backend/tactus_backend.spec +0 -0
  350. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/package-lock.json +0 -0
  351. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/package.json +0 -0
  352. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/preload/preload.ts +0 -0
  353. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/preload/tsconfig.json +0 -0
  354. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/rebuild-and-test.sh +0 -0
  355. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/scripts/build-backend.js +0 -0
  356. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/scripts/build-frontend.js +0 -0
  357. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/backend-manager.ts +0 -0
  358. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/main.ts +0 -0
  359. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/menu.ts +0 -0
  360. {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/tsconfig.json +0 -0
  361. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/ARCHITECTURE.md +0 -0
  362. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/CHANGELOG.md +0 -0
  363. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/DEV_MODE.md +0 -0
  364. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/QUICK_START.md +0 -0
  365. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/README.md +0 -0
  366. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  367. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
  368. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/README.md +0 -0
  369. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/events.py +0 -0
  370. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/logging_capture.py +0 -0
  371. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/lsp_server.py +0 -0
  372. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/requirements.txt +0 -0
  373. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  374. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/test_lsp_server.py +0 -0
  375. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/dev.sh +0 -0
  376. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
  377. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  378. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  379. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/README.md +0 -0
  380. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/demo.ts +0 -0
  381. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/index.html +0 -0
  382. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/jest.config.js +0 -0
  383. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/package-lock.json +0 -0
  384. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/package.json +0 -0
  385. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/postcss.config.js +0 -0
  386. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/App.tsx +0 -0
  387. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
  388. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  389. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  390. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  391. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  392. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  393. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  394. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  395. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  396. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  397. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  398. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
  399. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  400. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  401. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  402. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  403. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  404. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  405. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  406. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  407. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
  408. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
  409. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  410. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  411. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  412. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  413. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  414. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  415. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  416. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  417. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  418. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  419. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  420. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  421. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  422. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  423. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  424. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
  425. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
  426. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
  427. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  428. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
  429. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  430. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  431. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
  432. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  433. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  434. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  435. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  436. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  437. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
  438. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  439. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  440. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  441. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  442. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  443. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  444. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  445. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
  446. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  447. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  448. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  449. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  450. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  451. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  452. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  453. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  454. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  455. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  456. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  457. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  458. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  459. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  460. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  461. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  462. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  463. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  464. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  465. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  466. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  467. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  468. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  469. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  470. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  471. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  472. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  473. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  474. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
  475. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  476. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/index.css +0 -0
  477. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  478. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/main.tsx +0 -0
  479. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/events.ts +0 -0
  480. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  481. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/results.ts +0 -0
  482. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  483. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  484. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  485. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  486. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
  487. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  488. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tailwind.config.js +0 -0
  489. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.json +0 -0
  490. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
  491. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/vite.config.ts +0 -0
  492. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  493. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/package.json +0 -0
  494. {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/start-dev.sh +0 -0
  495. {tactus-0.21.0 → tactus-0.21.1}/tests/__init__.py +0 -0
  496. {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/__init__.py +0 -0
  497. {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
  498. {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/test_plugins.py +0 -0
  499. {tactus-0.21.0 → tactus-0.21.1}/tests/cli/__init__.py +0 -0
  500. {tactus-0.21.0 → tactus-0.21.1}/tests/cli/test_cli.py +0 -0
  501. {tactus-0.21.0 → tactus-0.21.1}/tests/cli/test_cli_inputs.py +0 -0
  502. {tactus-0.21.0 → tactus-0.21.1}/tests/conftest.py +0 -0
  503. {tactus-0.21.0 → tactus-0.21.1}/tests/core/__init__.py +0 -0
  504. {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_config_manager.py +0 -0
  505. {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_determinism_safety.py +0 -0
  506. {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_lua_sandbox_security.py +0 -0
  507. {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_runtime_inputs.py +0 -0
  508. {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_script_mode.py +0 -0
  509. {tactus-0.21.0 → tactus-0.21.1}/tests/dspy/__init__.py +0 -0
  510. {tactus-0.21.0 → tactus-0.21.1}/tests/dspy/test_streaming.py +0 -0
  511. {tactus-0.21.0 → tactus-0.21.1}/tests/fixtures/__init__.py +0 -0
  512. {tactus-0.21.0 → tactus-0.21.1}/tests/fixtures/test_mcp_server.py +0 -0
  513. {tactus-0.21.0 → tactus-0.21.1}/tests/integration/test_named_procedures.py +0 -0
  514. {tactus-0.21.0 → tactus-0.21.1}/tests/mocks/__init__.py +0 -0
  515. {tactus-0.21.0 → tactus-0.21.1}/tests/mocks/llm_mocks.py +0 -0
  516. {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_retry_primitive.py +0 -0
  517. {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_state_primitive.py +0 -0
  518. {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_tool_primitive.py +0 -0
  519. {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_toolset_dsl.py +0 -0
  520. {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/__init__.py +0 -0
  521. {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/test_loader.py +0 -0
  522. {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/test_require_python.py +0 -0
  523. {tactus-0.21.0 → tactus-0.21.1}/tests/test_checkpoints_integration.py +0 -0
  524. {tactus-0.21.0 → tactus-0.21.1}/tests/test_mcp_integration.py +0 -0
  525. {tactus-0.21.0 → tactus-0.21.1}/tests/test_tracing.py +0 -0
  526. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/__init__.py +0 -0
  527. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/conftest.py +0 -0
  528. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_all_examples.py +0 -0
  529. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_e2e.py +0 -0
  530. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_gherkin_parser.py +0 -0
  531. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_integration.py +0 -0
  532. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_models.py +0 -0
  533. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_runtime_integration.py +0 -0
  534. {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_step_registry.py +0 -0
  535. {tactus-0.21.0 → tactus-0.21.1}/tests/utils/__init__.py +0 -0
  536. {tactus-0.21.0 → tactus-0.21.1}/tests/utils/test_safe_file_library.py +0 -0
  537. {tactus-0.21.0 → tactus-0.21.1}/tests/validation/__init__.py +0 -0
@@ -77,10 +77,10 @@ jobs:
77
77
  semantic-release publish
78
78
 
79
79
  - name: Publish to PyPI
80
- if: success()
80
+ if: success() && hashFiles('dist/*') != ''
81
81
  env:
82
82
  TWINE_USERNAME: __token__
83
83
  TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
84
84
  run: |
85
85
  pip install twine
86
- twine upload dist/*
86
+ twine upload --skip-existing dist/*
@@ -37,6 +37,7 @@ yarn-error.log*
37
37
  .tactus/config.yml
38
38
  progress.output
39
39
  .tac/
40
+ tmp/
40
41
  examples/output/
41
42
 
42
43
  *storybook.log
@@ -2,26 +2,52 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.21.1 (2026-01-10)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **ci**: Add --skip-existing to twine upload
10
+ ([`7a1b369`](https://github.com/AnthusAI/Tactus/commit/7a1b369376ce68869b98f0faed877a52855b4459))
11
+
12
+
5
13
  ## v0.21.0 (2026-01-10)
6
14
 
7
15
  ### Bug Fixes
8
16
 
17
+ - Add Checkpoint.exists and Checkpoint.get
18
+ ([`d652411`](https://github.com/AnthusAI/Tactus/commit/d6524115dea8de42559b94a1f35309f7538958e7))
19
+
20
+ - Add System.alert primitive
21
+ ([`18ece11`](https://github.com/AnthusAI/Tactus/commit/18ece114eea760e97b07a493b7ee13eb27034516))
22
+
9
23
  - Clarify summarization prompts are logged
10
- ([`1fbabee`](https://github.com/AnthusAI/Tactus/commit/1fbabeef3c6634fb9b2927e39a3e575f1074ff7d))
24
+ ([`423b912`](https://github.com/AnthusAI/Tactus/commit/423b912c590cd7e9702a0e9dbb76288f26cdfd4a))
11
25
 
12
26
  - Clarify template namespaces and rendering
13
- ([`b4b61c1`](https://github.com/AnthusAI/Tactus/commit/b4b61c15107a85c83c7646d347fafc3dd98943c3))
27
+ ([`a33a383`](https://github.com/AnthusAI/Tactus/commit/a33a3831fb335b81d1e3152f5feb6d24f436bdb8))
28
+
29
+ - Expose agent Result usage and history
30
+ ([`7f41286`](https://github.com/AnthusAI/Tactus/commit/7f412860f94c79a442fc8e86365f71ddddc9b58f))
31
+
32
+ - Handle string input in agent __call__ method
33
+ ([`4af6ad5`](https://github.com/AnthusAI/Tactus/commit/4af6ad590cacb116885ce60ca93656c092f01435))
14
34
 
15
35
  - Remove incompatible tests and skip deprecated YAML test
16
- ([`5960ed3`](https://github.com/AnthusAI/Tactus/commit/5960ed3580d958101dffca626c0d2cdd773e83be))
36
+ ([`f96f084`](https://github.com/AnthusAI/Tactus/commit/f96f0842ceffa8176329b5553096c39ff1ba15d1))
37
+
38
+ - Standardize on TactusResult.value and fix agent mock lookup
39
+ ([`a4e02c0`](https://github.com/AnthusAI/Tactus/commit/a4e02c0699a40461a2d0476e1359216d02a82616))
17
40
 
18
41
  - Support message alias for agent calls
19
- ([`43c911b`](https://github.com/AnthusAI/Tactus/commit/43c911bd9ad8aa3be6b7f0751f044d25f40cd9fa))
42
+ ([`9a2b817`](https://github.com/AnthusAI/Tactus/commit/9a2b817478acf5848dad346fa9d0f0dd1a78eb86))
43
+
44
+ - **ci**: Only run twine upload when dist files exist
45
+ ([`d490f55`](https://github.com/AnthusAI/Tactus/commit/d490f5527c8588666ffcafa67d13e195815c2856))
20
46
 
21
47
  ### Chores
22
48
 
23
49
  - Update .gitignore to include tmp/ directory
24
- ([`9871bae`](https://github.com/AnthusAI/Tactus/commit/9871baeaa0d0dd3a14861d1e88b329164f238a2f))
50
+ ([`1294360`](https://github.com/AnthusAI/Tactus/commit/1294360a261cec1ff8c35f8063ae2b652c340373))
25
51
 
26
52
 
27
53
  ## v0.20.0 (2026-01-09)
@@ -741,9 +741,9 @@ Defines interface for HITL implementations.
741
741
 
742
742
  **Specification**: Programmatic alerts from anywhere (not just procedures).
743
743
 
744
- **Status**: **Not Implemented**
744
+ **Status**: **Implemented**
745
745
 
746
- Only `Human.notify()` exists, which logs notifications. No `System.alert()` primitive or system-level alert infrastructure.
746
+ Implemented as a non-blocking primitive that emits a structured `SystemAlertEvent` via the configured `LogHandler` (CLI/IDE), with a fallback to standard Python logging when no handler is present.
747
747
 
748
748
  #### Message Classification
749
749
 
@@ -1103,6 +1103,9 @@ Explicit checkpoints do **not** create suspend points. They simply persist curre
1103
1103
 
1104
1104
  - ✅ `Checkpoint.clear_all()` - Clear all checkpoints (execution log)
1105
1105
  - ✅ `Checkpoint.clear_after(position)` - Clear from position onwards
1106
+ - ✅ `Checkpoint.next_position()` - Get next checkpoint position
1107
+ - ✅ `Checkpoint.exists(position)` - Check whether a checkpoint exists
1108
+ - ✅ `Checkpoint.get(position)` - Get cached value (or nil)
1106
1109
 
1107
1110
  **Usage**: Testing and debugging checkpoint replay behavior. These are utility functions for test scenarios, not for production use.
1108
1111
 
@@ -1181,35 +1184,30 @@ main = procedure("main", {
1181
1184
  end)
1182
1185
  ```
1183
1186
 
1184
- #### ResultPrimitive (`tactus/primitives/result.py`)
1185
-
1186
- **Status**: ✅ **Fully Implemented**
1187
+ #### Result (`tactus/protocols/result.py`)
1187
1188
 
1188
- Wraps pydantic-ai's `RunResult` for Lua access.
1189
+ **Status**: **Implemented (DSPy)**
1189
1190
 
1190
- **Aligned with pydantic-ai:** Direct mapping to `RunResult.data`, `RunResult.usage()`, `RunResult.new_messages()`, `RunResult.all_messages()`.
1191
+ `Agent()` returns a standard `TactusResult` wrapper (instead of raw text).
1191
1192
 
1192
1193
  **Features:**
1193
- - ✅ `result.data` - Response data (text or structured dict)
1194
+ - ✅ `result.value` - Response value (string or structured data)
1194
1195
  - ✅ `result.usage` - Token usage stats (prompt_tokens, completion_tokens, total_tokens)
1195
- - ✅ `result.new_messages()` - Messages from this turn
1196
- - ✅ `result.all_messages()` - Full conversation history
1197
- - `result.cost()` - Token usage (for cost calculation)
1196
+ - ✅ `result.cost()` - Cost stats (total_cost, prompt_cost, completion_cost)
1197
+
1198
+ **Breaking change:** Access agent output via `result.value` (not `result.message` / `result.data`).
1198
1199
 
1199
- **Breaking change:** `Agent()` now returns `ResultPrimitive` instead of raw data. Access response via `result.data`.
1200
+ **Implementation locations:**
1201
+ - `tactus/dspy/agent.py` (`DSPyAgentHandle.__call__`)
1202
+ - `tactus/protocols/result.py` (`TactusResult`)
1203
+ - `tactus/protocols/cost.py` (`UsageStats`, `CostStats`)
1200
1204
 
1201
1205
  **Example:**
1202
1206
  ```lua
1203
1207
  local result = Agent()
1204
-
1205
- -- Access response
1206
- Log.info(result.data)
1207
-
1208
- -- Access usage
1208
+ Log.info(result.value)
1209
1209
  Log.info("Tokens", {total = result.usage.total_tokens})
1210
-
1211
- -- Access messages
1212
- local msgs = result.new_messages()
1210
+ Log.info("Cost", {total = result.cost().total_cost})
1213
1211
  ```
1214
1212
 
1215
1213
  #### Structured Output (output_type)
@@ -1234,7 +1232,7 @@ agent("extractor", {
1234
1232
 
1235
1233
  -- Agent automatically validates output against schema
1236
1234
  local result = Extractor()
1237
- Log.info(result.data.city) -- Type-safe access
1235
+ Log.info(result.value.city)
1238
1236
  ```
1239
1237
 
1240
1238
  #### State Primitives
@@ -1756,9 +1754,9 @@ tactus evaluate procedure.tac --runs 10
1756
1754
  - Only local context exists
1757
1755
  - No AWS Lambda integration
1758
1756
 
1759
- 4. **System.alert()**
1760
- - No system-level alerts
1761
- - Only `Human.notify()` exists
1757
+ 4. **System.alert()**
1758
+ - Non-blocking alerts via `System.alert()`
1759
+ - Emits structured `system_alert` events to log handlers (CLI/IDE)
1762
1760
 
1763
1761
  5. **Async Procedure Spawning** ❌
1764
1762
  - No `Procedure.spawn()` for async invocation
@@ -1825,7 +1823,6 @@ tactus/
1825
1823
  │ ├── retry.py # RetryPrimitive
1826
1824
  │ ├── file.py # FilePrimitive
1827
1825
  │ ├── message_history.py # MessageHistoryPrimitive
1828
- │ ├── result.py # ResultPrimitive
1829
1826
  │ └── deps_generator.py # Dynamic AgentDeps generation [NEW]
1830
1827
 
1831
1828
  ├── backends/
@@ -1902,7 +1899,7 @@ To align the implementation with the specification:
1902
1899
  ### Medium Priority
1903
1900
  4. **Inline Procedures** - Parse and support `procedures:` section in YAML
1904
1901
  5. **Agent `prepare` hook** - Enable `prepared` template namespace
1905
- 6. **System.alert()** - System-level alert infrastructure
1902
+ 6. **System.alert() integrations** - Route alerts to external monitoring
1906
1903
  7. **Template variables** - Add `context`, `env`, `output` support
1907
1904
  8. **More Model Backends** - BERT, scikit-learn, ONNX, SageMaker
1908
1905
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.21.0
3
+ Version: 0.21.1
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
@@ -356,13 +356,11 @@ This ensures type-safe, structured outputs from agents.
356
356
  **Aligned with pydantic-ai:** The Result object wraps pydantic-ai's `RunResult` and provides Lua-accessible properties.
357
357
 
358
358
  **Properties:**
359
- - `result.message` - The response message (text string or structured data dict)
359
+ - `result.value` - The response value (string or structured data)
360
360
  - `result.usage` - Token usage stats (prompt_tokens, completion_tokens, total_tokens)
361
361
 
362
362
  **Methods:**
363
- - `result.new_messages()` - Messages from this turn only
364
- - `result.all_messages()` - Full conversation history
365
- - `result.cost()` - Token usage (same as .usage, for cost calculation)
363
+ - `result.cost()` - Cost statistics (total_cost, prompt_cost, completion_cost)
366
364
 
367
365
  **Example:**
368
366
 
@@ -377,8 +375,8 @@ Procedure {
377
375
  function(input)
378
376
  local result = worker()
379
377
 
380
- -- Access response message
381
- Log.info("Response", {message = result.message})
378
+ -- Access response value
379
+ Log.info("Response", {value = result.value})
382
380
 
383
381
  -- Access token usage
384
382
  Log.info("Tokens used", {
@@ -387,11 +385,6 @@ Procedure {
387
385
  total = result.usage.total_tokens
388
386
  })
389
387
 
390
- -- Access messages
391
- local messages = result.new_messages()
392
- for i, msg in ipairs(messages) do
393
- Log.info("Message", {role = msg.role, content = msg.content})
394
- end
395
388
  end
396
389
  }
397
390
  ```
@@ -414,8 +407,8 @@ Procedure {
414
407
 
415
408
  -- Access structured data fields
416
409
  Log.info("Extracted", {
417
- city = result.message.city,
418
- country = result.message.country
410
+ city = result.value.city,
411
+ country = result.value.country
419
412
  })
420
413
  end
421
414
  }
@@ -2197,6 +2190,8 @@ For testing and debugging:
2197
2190
  Checkpoint.clear_all() -- Clear all checkpoints
2198
2191
  Checkpoint.clear_after(position) -- Clear checkpoint at position and all after (position is a number)
2199
2192
  Checkpoint.next_position() -- Get the next checkpoint position number
2193
+ Checkpoint.exists(position) -- Check if a checkpoint exists at a position
2194
+ Checkpoint.get(position) -- Get cached value at a position (or nil)
2200
2195
  ```
2201
2196
 
2202
2197
  ### Human Interaction Primitives
@@ -2477,9 +2472,9 @@ local error_matcher = contains("error")
2477
2472
 
2478
2473
  -- Use in conditional logic
2479
2474
  local result = worker()
2480
- if result.message:find("success") then
2475
+ if tostring(result.value):find("success") then
2481
2476
  -- Contains success
2482
- elseif result.message:find("error") then
2477
+ elseif tostring(result.value):find("error") then
2483
2478
  -- Contains error
2484
2479
  end
2485
2480
  ```
@@ -3260,4 +3255,4 @@ Tests are executed using Behave programmatically with:
3260
3255
 
3261
3256
  **Declarative + Imperative:** Declare HITL points in YAML for documentation, invoke them in Lua for control.
3262
3257
 
3263
- **BDD Testing:** First-class Gherkin specifications with built-in steps, custom steps, parallel execution, and consistency evaluation.
3258
+ **BDD Testing:** First-class Gherkin specifications with built-in steps, custom steps, parallel execution, and consistency evaluation.
@@ -77,37 +77,32 @@ These are minor features documented in the spec that could be implemented with s
77
77
 
78
78
  ### Checkpoint Inspection Methods
79
79
 
80
- The spec documents methods to inspect checkpoint state that don't exist:
81
-
82
- ```lua
83
- Checkpoint.exists(name) -- Check if a checkpoint exists
84
- Checkpoint.get(name) -- Get the cached value from a checkpoint
85
- ```
86
-
87
- **What exists:** `clear_all()`, `clear_after(position)`, `next_position()`
88
-
89
- **Why it matters:** These would be useful for testing and debugging checkpoint behavior.
90
-
91
- **Implementation location:** `tactus/primitives/step.py` CheckpointPrimitive class
80
+ Implemented in `tactus/primitives/step.py` (`Checkpoint.exists(position)`, `Checkpoint.get(position)`).
92
81
 
93
82
  ---
94
83
 
95
84
  ### Result Object with Usage Statistics
96
85
 
97
- The spec documents a rich Result object with token usage and message history:
86
+ We want a standard Result object with response data + token usage + cost:
98
87
 
99
88
  ```lua
100
- result.usage -- {prompt_tokens, completion_tokens, total_tokens}
101
- result.new_messages() -- Messages from this turn only
102
- result.all_messages() -- Full conversation history
103
- result.cost() -- Cost calculation
89
+ result.value -- string or structured data
90
+ result.usage -- {prompt_tokens, completion_tokens, total_tokens}
91
+ result.cost() -- {total_cost, prompt_cost, completion_cost}
104
92
  ```
105
93
 
106
- **What exists:** `TactusPrediction` with `.text` only
94
+ **What exists now:** `TactusResult` returned by `Agent()` (breaking change: use `result.value`)
95
+
96
+ **Intentionally not implemented (YAGNI for now):**
97
+ - `result.new_messages()`
98
+ - `result.all_messages()`
107
99
 
108
100
  **Why it matters:** Users can't track token usage or costs per-call, which is important for optimization and budgeting.
109
101
 
110
- **Implementation location:** `tactus/dspy/prediction.py`
102
+ **Implementation locations:**
103
+ - `tactus/dspy/agent.py`
104
+ - `tactus/protocols/result.py`
105
+ - `tactus/protocols/cost.py`
111
106
 
112
107
  ---
113
108
 
@@ -1097,7 +1097,7 @@ class AgentPrimitive:
1097
1097
  )
1098
1098
  return {
1099
1099
  "output": result.output,
1100
- "messages": self.messages + result.new_messages()
1100
+ "messages": self.messages
1101
1101
  }
1102
1102
  ```
1103
1103
 
@@ -1390,4 +1390,4 @@ result = await runtime.execute(
1390
1390
 
1391
1391
  4. **Observability**: Integration with Logfire/OpenTelemetry for tracing?
1392
1392
 
1393
- 5. **Error recovery**: Retry policies, dead letter queues, manual intervention?
1393
+ 5. **Error recovery**: Retry policies, dead letter queues, manual intervention?
@@ -1126,7 +1126,7 @@ sequenceDiagram
1126
1126
  PA->>LLM: Send tool result
1127
1127
  LLM-->>PA: Final response
1128
1128
  PA-->>AP: RunResult
1129
- AP-->>Lua: ResultPrimitive
1129
+ AP-->>Lua: Result
1130
1130
 
1131
1131
  Lua->>Lua: search.called()
1132
1132
  Lua->>Lua: search.last_result()
@@ -5,5 +5,5 @@ World = Agent {
5
5
  }
6
6
 
7
7
  return {
8
- message = (World {message = "Hello, World!"}).response
8
+ World("Hello, World!")
9
9
  }
@@ -45,7 +45,7 @@ Procedure {
45
45
  if done.called() then
46
46
  research = done.last_result() or "Task completed"
47
47
  else
48
- research = result.message or "Research not completed"
48
+ research = tostring(result.value) or "Research not completed"
49
49
  Log.warn("Researcher did not call done within max turns")
50
50
  end
51
51
  state.research = research
@@ -66,7 +66,7 @@ Procedure {
66
66
  if done.called() then
67
67
  summary = done.last_result() or "Task completed"
68
68
  else
69
- summary = result.message or "Summary not completed"
69
+ summary = tostring(result.value) or "Summary not completed"
70
70
  Log.warn("Summarizer did not call done within max turns")
71
71
  end
72
72
 
@@ -26,7 +26,7 @@ Procedure {
26
26
  local result = storyteller({message = input.prompt})
27
27
 
28
28
  return {
29
- story = result.response,
29
+ story = result.value,
30
30
  success = true
31
31
  }
32
32
  end
@@ -36,9 +36,9 @@ Procedure {
36
36
  local response = haiku_assistant()
37
37
  turn_count = turn_count + 1
38
38
 
39
- -- Accumulate the response message from each turn using .message property
40
- if response.message and response.message ~= "" then
41
- response_text = response_text .. response.message
39
+ -- Accumulate the response value from each turn using .value property
40
+ if response.value and response.value ~= "" then
41
+ response_text = response_text .. response.value
42
42
  end
43
43
 
44
44
  -- Safety check: exit if too many turns
@@ -137,8 +137,8 @@ Procedure {
137
137
  local response = agent_ref()
138
138
  turn_count = turn_count + 1
139
139
 
140
- if response.message and response.message ~= "" then
141
- response_text = response_text .. response.message
140
+ if response.value and response.value ~= "" then
141
+ response_text = response_text .. response.value
142
142
  end
143
143
 
144
144
  if turn_count >= max_turns then
@@ -175,7 +175,7 @@ Procedure {
175
175
  local success, result = pcall(function(input)
176
176
  local response = agent_ref()
177
177
  return {
178
- response = response.message or "",
178
+ response = response.value or "",
179
179
  turns = 1,
180
180
  success = true,
181
181
  error = nil
@@ -56,8 +56,8 @@ Procedure {
56
56
  pro_turns = pro_turns + 1
57
57
 
58
58
  -- Accumulate the response text
59
- if response.message and response.message ~= "" then
60
- pro_response = pro_response .. response.message
59
+ if response.value and response.value ~= "" then
60
+ pro_response = pro_response .. response.value
61
61
  end
62
62
 
63
63
  -- Safety check
@@ -86,8 +86,8 @@ Procedure {
86
86
  flash_turns = flash_turns + 1
87
87
 
88
88
  -- Accumulate the response text
89
- if response.message and response.message ~= "" then
90
- flash_response = flash_response .. response.message
89
+ if response.value and response.value ~= "" then
90
+ flash_response = flash_response .. response.value
91
91
  end
92
92
 
93
93
  -- Safety check
@@ -1,11 +1,11 @@
1
1
  -- Structured Output Demo
2
2
  -- Demonstrates using output for structured data extraction
3
- -- and accessing result.data, result.usage
3
+ -- and accessing result.value, result.usage
4
4
 
5
5
  extractor = Agent {
6
6
  provider = "openai",
7
7
  model = "gpt-4o-mini",
8
- system_prompt = [[You extract city information. Return ONLY structured data with these fields:
8
+ system_prompt = [[You extract city information. Return ONLY a JSON object with these fields:
9
9
  - city: city name
10
10
  - country: country name
11
11
  - population: estimated population (number, optional)
@@ -32,30 +32,26 @@ Procedure {
32
32
  function(input)
33
33
  Log.info("Starting structured output demo", {query = input.query})
34
34
 
35
- -- Call agent - in mock mode, returns mock response
35
+ -- Agent returns a Result wrapper (not raw data)
36
36
  local result = extractor()
37
37
 
38
- -- Extract city data from response message
39
- -- Note: Full result.data/result.usage support pending for mock mode
40
- local city_data = {
41
- city = "Paris",
42
- country = "France",
43
- population = 2161000
44
- }
45
-
46
- -- If the agent result has message, log it
47
- if result and result.message then
48
- Log.info("Agent response", {message = result.message})
49
- end
50
-
51
- Log.info("Extracted city information", city_data)
38
+ -- Access structured data via result.value
39
+ Log.info("Extracted city information", {
40
+ city = result.value.city,
41
+ country = result.value.country,
42
+ population = result.value.population or "unknown"
43
+ })
52
44
 
53
- -- Simulated token count for demo
54
- local tokens_used = 150
45
+ -- Access token usage stats
46
+ Log.info("Token usage", {
47
+ prompt_tokens = result.usage.prompt_tokens,
48
+ completion_tokens = result.usage.completion_tokens,
49
+ total_tokens = result.usage.total_tokens
50
+ })
55
51
 
56
52
  return {
57
- city_data = city_data,
58
- tokens_used = tokens_used
53
+ city_data = result.value,
54
+ tokens_used = result.usage.total_tokens
59
55
  }
60
56
  end
61
57
  }
@@ -83,7 +83,7 @@ Procedure {
83
83
  end
84
84
  else
85
85
  -- Max turns reached - use last response
86
- answer = result.message
86
+ answer = tostring(result.value)
87
87
  end
88
88
 
89
89
  return {
@@ -103,7 +103,7 @@ Procedure {
103
103
  turn_count = turn_count + 1
104
104
  until done.called() or turn_count >= max_turns
105
105
 
106
- local response = result.message
106
+ local response = tostring(result.value)
107
107
  Log.info(agent_name .. " response", {text = response})
108
108
  return response
109
109
  end
@@ -123,7 +123,7 @@ Procedure {
123
123
  -- Test Agent 5: No tools (explicitly empty) - only needs 1 turn
124
124
  Log.info("Testing Agent 5: No tools")
125
125
  local observer_result = observer()
126
- local observer_response = observer_result.message
126
+ local observer_response = tostring(observer_result.value)
127
127
  Log.info("Observer response", {text = observer_response})
128
128
 
129
129
  return {
@@ -94,7 +94,8 @@ Procedure {
94
94
  else
95
95
  Log.warn("Agent did not call done within max turns")
96
96
  return {
97
- calculation_result = result.message or "Agent did not complete",
97
+ calculation_result = (result and result.value and tostring(result.value))
98
+ or "Agent did not complete",
98
99
  completed = false
99
100
  }
100
101
  end
@@ -110,7 +110,7 @@ Procedure {
110
110
  if done.called() then
111
111
  answer = done.last_result() or "Task completed"
112
112
  else
113
- answer = result.message
113
+ answer = tostring(result.value)
114
114
  end
115
115
 
116
116
  return {
@@ -140,7 +140,7 @@ Procedure {
140
140
  if done.called() then
141
141
  answer = done.last_result() or "Task completed"
142
142
  else
143
- answer = result.message
143
+ answer = tostring(result.value)
144
144
  end
145
145
 
146
146
  if #tools_used > 0 then
@@ -158,7 +158,7 @@ Procedure {
158
158
  if done.called() then
159
159
  answer = done.last_result() or "Task completed"
160
160
  else
161
- answer = result.message
161
+ answer = tostring(result.value)
162
162
  end
163
163
 
164
164
  return {
@@ -127,8 +127,8 @@ Procedure {
127
127
  answer = reason
128
128
  end
129
129
  end
130
- elseif result and result.message then
131
- answer = result.message
130
+ elseif result and result.value then
131
+ answer = tostring(result.value)
132
132
  end
133
133
 
134
134
  Log.info("Task completed", {result = answer, completed = completed})
@@ -122,8 +122,8 @@ Procedure {
122
122
  answer = reason
123
123
  end
124
124
  end
125
- elseif result and result.message then
126
- answer = result.message
125
+ elseif result and result.value ~= nil then
126
+ answer = tostring(result.value)
127
127
  end
128
128
 
129
129
  Log.info("Task result", {
@@ -106,8 +106,8 @@ Procedure {
106
106
  answer = reason
107
107
  end
108
108
  end
109
- elseif result and result.message then
110
- answer = result.message
109
+ elseif result and result.value ~= nil then
110
+ answer = tostring(result.value)
111
111
  end
112
112
 
113
113
  Log.info("Import result", {
@@ -13,8 +13,8 @@ Procedure {
13
13
 
14
14
  log("Starting test...")
15
15
  local result = test_agent()
16
- log("Agent responded: " .. result.data)
16
+ log("Agent responded: " .. tostring(result.value))
17
17
  return {success = true}
18
18
 
19
19
  end
20
- }
20
+ }