tactus 0.20.1__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 (555) hide show
  1. {tactus-0.20.1 → tactus-0.21.1}/.github/workflows/release.yml +2 -2
  2. {tactus-0.20.1 → tactus-0.21.1}/.gitignore +2 -0
  3. {tactus-0.20.1 → tactus-0.21.1}/CHANGELOG.md +43 -3
  4. {tactus-0.20.1 → tactus-0.21.1}/IMPLEMENTATION.md +23 -26
  5. {tactus-0.20.1 → tactus-0.21.1}/PKG-INFO +1 -1
  6. {tactus-0.20.1 → tactus-0.21.1}/SPECIFICATION.md +12 -17
  7. {tactus-0.20.1 → tactus-0.21.1}/TECHNICAL_DEBT.md +14 -19
  8. {tactus-0.20.1 → tactus-0.21.1}/docs/CONFIGURATION.md +133 -0
  9. {tactus-0.20.1 → tactus-0.21.1}/docs/DURABILITY.md +2 -2
  10. tactus-0.21.1/docs/SANDBOXING.md +499 -0
  11. {tactus-0.20.1 → tactus-0.21.1}/docs/TOOL_ROADMAP.md +1 -1
  12. {tactus-0.20.1 → tactus-0.21.1}/examples/01-basics-hello-world.tac +1 -1
  13. {tactus-0.20.1 → tactus-0.21.1}/examples/04-basics-simple-agent.tac +10 -0
  14. {tactus-0.20.1 → tactus-0.21.1}/examples/05-basics-multi-model.tac +19 -4
  15. {tactus-0.20.1 → tactus-0.21.1}/examples/06-basics-streaming.tac +1 -1
  16. {tactus-0.20.1 → tactus-0.21.1}/examples/07-basics-bedrock.tac +13 -3
  17. {tactus-0.20.1 → tactus-0.21.1}/examples/08-basics-models.tac +49 -6
  18. {tactus-0.20.1 → tactus-0.21.1}/examples/09-basics-google-gemini.tac +22 -12
  19. {tactus-0.20.1 → tactus-0.21.1}/examples/11-feature-message-history.tac +8 -0
  20. {tactus-0.20.1 → tactus-0.21.1}/examples/12-feature-structured-output.tac +21 -20
  21. {tactus-0.20.1 → tactus-0.21.1}/examples/13-feature-session.tac +8 -0
  22. {tactus-0.20.1 → tactus-0.21.1}/examples/14-feature-per-turn-tools.tac +9 -0
  23. {tactus-0.20.1 → tactus-0.21.1}/examples/15-feature-local-tools.tac +1 -1
  24. {tactus-0.20.1 → tactus-0.21.1}/examples/16-feature-toolsets-advanced.tac +44 -26
  25. {tactus-0.20.1 → tactus-0.21.1}/examples/17-feature-toolsets-dsl.tac +18 -3
  26. {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-individual.tac +14 -4
  27. {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-inline.tac +14 -3
  28. {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-toolset.tac +14 -4
  29. {tactus-0.20.1 → tactus-0.21.1}/examples/19-feature-direct-tool-calls.tac +15 -5
  30. {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac +13 -0
  31. {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac +10 -0
  32. {tactus-0.20.1 → tactus-0.21.1}/examples/31-eval-demo.tac +23 -4
  33. {tactus-0.20.1 → tactus-0.21.1}/examples/32-eval-success-rate.tac +23 -4
  34. {tactus-0.20.1 → tactus-0.21.1}/examples/33-eval-thresholds.tac +23 -4
  35. {tactus-0.20.1 → tactus-0.21.1}/examples/34-eval-dataset.tac +23 -4
  36. {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac +30 -8
  37. {tactus-0.20.1 → tactus-0.21.1}/examples/36-eval-advanced.tac +10 -0
  38. {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac +22 -6
  39. {tactus-0.20.1 → tactus-0.21.1}/examples/40-model-text-classifier.tac +31 -10
  40. {tactus-0.20.1 → tactus-0.21.1}/examples/41-model-pytorch.tac +32 -10
  41. {tactus-0.20.1 → tactus-0.21.1}/examples/44-sub-procedure-composition.tac +36 -37
  42. {tactus-0.20.1 → tactus-0.21.1}/examples/52-file-io-basics.tac +4 -4
  43. {tactus-0.20.1 → tactus-0.21.1}/examples/53-tsv-file-io.tac +4 -4
  44. {tactus-0.20.1 → tactus-0.21.1}/examples/54-json-file-io.tac +4 -4
  45. {tactus-0.20.1 → tactus-0.21.1}/examples/55-parquet-file-io.tac +4 -4
  46. {tactus-0.20.1 → tactus-0.21.1}/examples/56-hdf5-file-io.tac +9 -9
  47. {tactus-0.20.1 → tactus-0.21.1}/examples/57-excel-file-io.tac +7 -7
  48. {tactus-0.20.1 → tactus-0.21.1}/examples/58-text-file-io.tac +13 -13
  49. {tactus-0.20.1 → tactus-0.21.1}/examples/60-tool-sources.tac +17 -19
  50. {tactus-0.20.1 → tactus-0.21.1}/examples/61-inline-toolset-lua.tac +17 -14
  51. {tactus-0.20.1 → tactus-0.21.1}/examples/62-mcp-toolset-by-server.tac +2 -2
  52. {tactus-0.20.1 → tactus-0.21.1}/examples/63-toolset-import-from-file.tac +18 -18
  53. {tactus-0.20.1 → tactus-0.21.1}/examples/65-optional-state-demo.tac +21 -13
  54. {tactus-0.20.1 → tactus-0.21.1}/examples/70-mocking-static.tac +10 -9
  55. {tactus-0.20.1 → tactus-0.21.1}/examples/71-mocking-temporal.tac +15 -15
  56. {tactus-0.20.1 → tactus-0.21.1}/examples/72-mocking-conditional.tac +10 -26
  57. {tactus-0.20.1 → tactus-0.21.1}/examples/99-misc-test-loading.tac +2 -2
  58. {tactus-0.20.1 → tactus-0.21.1}/features/32_result_object.feature +6 -8
  59. {tactus-0.20.1 → tactus-0.21.1}/features/steps/example_procedures_steps.py +5 -0
  60. {tactus-0.20.1 → tactus-0.21.1}/features/steps/result_and_output_steps.py +7 -7
  61. {tactus-0.20.1 → tactus-0.21.1}/pyproject.toml +1 -1
  62. {tactus-0.20.1 → tactus-0.21.1}/tactus/__init__.py +1 -1
  63. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/cli_log.py +25 -0
  64. tactus-0.21.1/tactus/adapters/http_callback_log.py +109 -0
  65. {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/app.py +190 -5
  66. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/config_manager.py +11 -1
  67. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dsl_stubs.py +105 -20
  68. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/execution_context.py +8 -0
  69. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/output_validator.py +3 -6
  70. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/registry.py +26 -0
  71. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/runtime.py +87 -39
  72. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/yaml_parser.py +11 -1
  73. tactus-0.21.1/tactus/docker/Dockerfile +57 -0
  74. tactus-0.21.1/tactus/docker/entrypoint.sh +68 -0
  75. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/agent.py +222 -93
  76. tactus-0.21.1/tactus/ide/coding_assistant.py +343 -0
  77. {tactus-0.20.1 → tactus-0.21.1}/tactus/ide/server.py +443 -65
  78. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/__init__.py +2 -0
  79. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/handles.py +11 -2
  80. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/step.py +57 -0
  81. tactus-0.21.1/tactus/primitives/system.py +93 -0
  82. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/tool.py +2 -0
  83. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/tool_handle.py +2 -2
  84. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/__init__.py +7 -0
  85. tactus-0.21.1/tactus/protocols/cost.py +31 -0
  86. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/log_handler.py +2 -2
  87. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/models.py +15 -1
  88. tactus-0.21.1/tactus/protocols/result.py +33 -0
  89. tactus-0.21.1/tactus/sandbox/__init__.py +63 -0
  90. tactus-0.21.1/tactus/sandbox/config.py +121 -0
  91. tactus-0.21.1/tactus/sandbox/container_runner.py +391 -0
  92. tactus-0.21.1/tactus/sandbox/docker_manager.py +321 -0
  93. tactus-0.21.1/tactus/sandbox/entrypoint.py +186 -0
  94. tactus-0.21.1/tactus/sandbox/protocol.py +222 -0
  95. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/done.tac +3 -3
  96. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/README.md +4 -0
  97. tactus-0.21.1/tactus/testing/mock_agent.py +223 -0
  98. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_tools.py +18 -7
  99. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/test_runner.py +18 -0
  100. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/test_lsp_server.py +4 -4
  101. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/package-lock.json +1471 -2095
  102. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/App.tsx +92 -4
  103. tactus-0.21.1/tactus-ide/frontend/src/components/ChatSidebar.tsx +195 -0
  104. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +27 -1
  105. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +31 -2
  106. tactus-0.21.1/tactus-ide/frontend/src/components/TestOptionsModal.tsx +185 -0
  107. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +6 -5
  108. tactus-0.21.1/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +194 -0
  109. tactus-0.21.1/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +95 -0
  110. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +2 -2
  111. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +15 -21
  112. tactus-0.21.1/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +42 -0
  113. tactus-0.21.1/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +262 -0
  114. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +91 -16
  115. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/events.ts +18 -1
  116. {tactus-0.20.1 → tactus-0.21.1}/tests/cli/test_cli.py +4 -2
  117. {tactus-0.20.1 → tactus-0.21.1}/tests/cli/test_cli_inputs.py +22 -11
  118. tactus-0.21.1/tests/primitives/test_checkpoint_primitive.py +48 -0
  119. tactus-0.21.1/tests/primitives/test_system_alert.py +73 -0
  120. {tactus-0.20.1 → tactus-0.21.1}/tests/test_mcp_integration.py +2 -5
  121. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_all_examples.py +17 -16
  122. tactus-0.20.1/examples/app_config.json +0 -1
  123. tactus-0.20.1/examples/app_summary.json +0 -1
  124. tactus-0.20.1/examples/data_export.csv +0 -11
  125. tactus-0.20.1/examples/executive_summary.xlsx +0 -0
  126. tactus-0.20.1/examples/inventory.tsv +0 -6
  127. tactus-0.20.1/examples/output_high_performers.csv +0 -5
  128. tactus-0.20.1/examples/output_summary.json +0 -5
  129. tactus-0.20.1/examples/product_analysis.xlsx +0 -0
  130. tactus-0.20.1/examples/sales_analysis.xlsx +0 -0
  131. tactus-0.20.1/examples/sales_report.xlsx +0 -0
  132. tactus-0.20.1/examples/scientific_data.h5 +0 -0
  133. tactus-0.20.1/examples/sensor_data.parquet +0 -0
  134. tactus-0.20.1/examples/sensor_report.parquet +0 -0
  135. tactus-0.20.1/examples/sensor_summary.parquet +0 -0
  136. tactus-0.20.1/examples/status_report.md +0 -31
  137. tactus-0.20.1/examples/summary.json +0 -6
  138. tactus-0.20.1/tactus/testing/mock_agent.py +0 -179
  139. tactus-0.20.1/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -29
  140. tactus-0.20.1/tmp/langchain.db/topics_llm_cache.db +0 -0
  141. {tactus-0.20.1 → tactus-0.21.1}/.claude/agents.md +0 -0
  142. {tactus-0.20.1 → tactus-0.21.1}/.github/workflows/desktop-release.yml +0 -0
  143. {tactus-0.20.1 → tactus-0.21.1}/.tactus/config.yml.example +0 -0
  144. {tactus-0.20.1 → tactus-0.21.1}/AGENTS.md +0 -0
  145. {tactus-0.20.1 → tactus-0.21.1}/LICENSE +0 -0
  146. {tactus-0.20.1 → tactus-0.21.1}/Makefile +0 -0
  147. {tactus-0.20.1 → tactus-0.21.1}/README.md +0 -0
  148. {tactus-0.20.1 → tactus-0.21.1}/SPECIFICATION.md.bak +0 -0
  149. {tactus-0.20.1 → tactus-0.21.1}/behave.ini +0 -0
  150. {tactus-0.20.1 → tactus-0.21.1}/docs/AGENTS.md +0 -0
  151. {tactus-0.20.1 → tactus-0.21.1}/docs/BDD_TESTING.md +0 -0
  152. {tactus-0.20.1 → tactus-0.21.1}/docs/FILE_IO.md +0 -0
  153. {tactus-0.20.1 → tactus-0.21.1}/docs/STREAMING.md +0 -0
  154. {tactus-0.20.1 → tactus-0.21.1}/docs/TOOLS.md +0 -0
  155. {tactus-0.20.1 → tactus-0.21.1}/examples/.tactus/config.yml +0 -0
  156. {tactus-0.20.1 → tactus-0.21.1}/examples/02-basics-simple-logic.tac +0 -0
  157. {tactus-0.20.1 → tactus-0.21.1}/examples/03-basics-parameters.tac +0 -0
  158. {tactus-0.20.1 → tactus-0.21.1}/examples/10-feature-state.tac +0 -0
  159. {tactus-0.20.1 → tactus-0.21.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
  160. {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak +0 -0
  161. {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak2 +0 -0
  162. {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak +0 -0
  163. {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak2 +0 -0
  164. {tactus-0.20.1 → tactus-0.21.1}/examples/30-eval-simple.tac +0 -0
  165. {tactus-0.20.1 → tactus-0.21.1}/examples/34-eval-dataset.jsonl +0 -0
  166. {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac.bak +0 -0
  167. {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac.bak2 +0 -0
  168. {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak +0 -0
  169. {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
  170. {tactus-0.20.1 → tactus-0.21.1}/examples/39-model-simple.tac +0 -0
  171. {tactus-0.20.1 → tactus-0.21.1}/examples/40-mcp-test.tac +0 -0
  172. {tactus-0.20.1 → tactus-0.21.1}/examples/41-mcp-simple.tac +0 -0
  173. {tactus-0.20.1 → tactus-0.21.1}/examples/43-sub-procedure-simple.tac +0 -0
  174. {tactus-0.20.1 → tactus-0.21.1}/examples/45-sub-procedure-recursive.tac +0 -0
  175. {tactus-0.20.1 → tactus-0.21.1}/examples/46-checkpoint-explicit.tac +0 -0
  176. {tactus-0.20.1 → tactus-0.21.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
  177. {tactus-0.20.1 → tactus-0.21.1}/examples/48-script-mode-simple.tac +0 -0
  178. {tactus-0.20.1 → tactus-0.21.1}/examples/50-inputs-showcase.tac +0 -0
  179. {tactus-0.20.1 → tactus-0.21.1}/examples/51-inputs-calculator.tac +0 -0
  180. {tactus-0.20.1 → tactus-0.21.1}/examples/64-require-modules.tac +0 -0
  181. {tactus-0.20.1 → tactus-0.21.1}/examples/README.md +0 -0
  182. {tactus-0.20.1 → tactus-0.21.1}/examples/app_config.ini +0 -0
  183. {tactus-0.20.1 → tactus-0.21.1}/examples/data/sample.csv +0 -0
  184. {tactus-0.20.1 → tactus-0.21.1}/examples/demo_output.json +0 -0
  185. {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/math_module.tac +0 -0
  186. {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/product.tac +0 -0
  187. {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/string_module.tac +0 -0
  188. {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/sum.tac +0 -0
  189. {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/text_tools.tac +0 -0
  190. {tactus-0.20.1 → tactus-0.21.1}/examples/inventory_summary.tsv +0 -0
  191. {tactus-0.20.1 → tactus-0.21.1}/examples/mock-config.json +0 -0
  192. {tactus-0.20.1 → tactus-0.21.1}/examples/models/README.md +0 -0
  193. {tactus-0.20.1 → tactus-0.21.1}/examples/models/create_sentiment_model.py +0 -0
  194. {tactus-0.20.1 → tactus-0.21.1}/examples/output_summary.txt +0 -0
  195. {tactus-0.20.1 → tactus-0.21.1}/examples/tools/calculations.py +0 -0
  196. {tactus-0.20.1 → tactus-0.21.1}/examples/tools/data_analysis.py +0 -0
  197. {tactus-0.20.1 → tactus-0.21.1}/examples/tools/search.py +0 -0
  198. {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/README.md +0 -0
  199. {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/simple_http_test.tac +0 -0
  200. {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/time_lookup.tac +0 -0
  201. {tactus-0.20.1 → tactus-0.21.1}/features/01_state_management.feature +0 -0
  202. {tactus-0.20.1 → tactus-0.21.1}/features/02_checkpointing.feature +0 -0
  203. {tactus-0.20.1 → tactus-0.21.1}/features/03_human_in_the_loop.feature +0 -0
  204. {tactus-0.20.1 → tactus-0.21.1}/features/04_control_flow.feature +0 -0
  205. {tactus-0.20.1 → tactus-0.21.1}/features/05_tool_integration.feature +0 -0
  206. {tactus-0.20.1 → tactus-0.21.1}/features/06_retry_logic.feature +0 -0
  207. {tactus-0.20.1 → tactus-0.21.1}/features/07_file_operations.feature +0 -0
  208. {tactus-0.20.1 → tactus-0.21.1}/features/08_agent_primitives.feature +0 -0
  209. {tactus-0.20.1 → tactus-0.21.1}/features/09_workflow_execution.feature +0 -0
  210. {tactus-0.20.1 → tactus-0.21.1}/features/10_lua_integration.feature +0 -0
  211. {tactus-0.20.1 → tactus-0.21.1}/features/11_storage_backends.feature +0 -0
  212. {tactus-0.20.1 → tactus-0.21.1}/features/12_json_operations.feature +0 -0
  213. {tactus-0.20.1 → tactus-0.21.1}/features/13_logging.feature +0 -0
  214. {tactus-0.20.1 → tactus-0.21.1}/features/14_stage_and_step_tracking.feature +0 -0
  215. {tactus-0.20.1 → tactus-0.21.1}/features/15_procedure_calls.feature +0 -0
  216. {tactus-0.20.1 → tactus-0.21.1}/features/16_session_management.feature +0 -0
  217. {tactus-0.20.1 → tactus-0.21.1}/features/17_lua_dsl_validation.feature +0 -0
  218. {tactus-0.20.1 → tactus-0.21.1}/features/18_example_procedures.feature +0 -0
  219. {tactus-0.20.1 → tactus-0.21.1}/features/19_ide_server.feature +0 -0
  220. {tactus-0.20.1 → tactus-0.21.1}/features/20_parameters.feature +0 -0
  221. {tactus-0.20.1 → tactus-0.21.1}/features/21_outputs.feature +0 -0
  222. {tactus-0.20.1 → tactus-0.21.1}/features/23_prompts.feature +0 -0
  223. {tactus-0.20.1 → tactus-0.21.1}/features/24_bdd_specifications.feature +0 -0
  224. {tactus-0.20.1 → tactus-0.21.1}/features/25_bdd_custom_steps.feature +0 -0
  225. {tactus-0.20.1 → tactus-0.21.1}/features/26_bdd_evaluation.feature +0 -0
  226. {tactus-0.20.1 → tactus-0.21.1}/features/27_default_settings.feature +0 -0
  227. {tactus-0.20.1 → tactus-0.21.1}/features/28_custom_prompts.feature +0 -0
  228. {tactus-0.20.1 → tactus-0.21.1}/features/29_execution_settings.feature +0 -0
  229. {tactus-0.20.1 → tactus-0.21.1}/features/30_session_filters.feature +0 -0
  230. {tactus-0.20.1 → tactus-0.21.1}/features/31_matchers.feature +0 -0
  231. {tactus-0.20.1 → tactus-0.21.1}/features/33_output_type.feature +0 -0
  232. {tactus-0.20.1 → tactus-0.21.1}/features/42_model_primitive.feature +0 -0
  233. {tactus-0.20.1 → tactus-0.21.1}/features/43_sub_procedure_checkpointing.feature +0 -0
  234. {tactus-0.20.1 → tactus-0.21.1}/features/46_explicit_checkpoint.feature +0 -0
  235. {tactus-0.20.1 → tactus-0.21.1}/features/48_script_mode.feature +0 -0
  236. {tactus-0.20.1 → tactus-0.21.1}/features/51_dspy_lm_config.feature +0 -0
  237. {tactus-0.20.1 → tactus-0.21.1}/features/52_dspy_signature.feature +0 -0
  238. {tactus-0.20.1 → tactus-0.21.1}/features/53_dspy_module.feature +0 -0
  239. {tactus-0.20.1 → tactus-0.21.1}/features/54_dspy_history.feature +0 -0
  240. {tactus-0.20.1 → tactus-0.21.1}/features/55_dspy_prediction.feature +0 -0
  241. {tactus-0.20.1 → tactus-0.21.1}/features/56_dspy_agent.feature +0 -0
  242. {tactus-0.20.1 → tactus-0.21.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  243. {tactus-0.20.1 → tactus-0.21.1}/features/documentation/Lua DSL/README.md +0 -0
  244. {tactus-0.20.1 → tactus-0.21.1}/features/environment.py +0 -0
  245. {tactus-0.20.1 → tactus-0.21.1}/features/steps/agent_primitives_steps.py +0 -0
  246. {tactus-0.20.1 → tactus-0.21.1}/features/steps/checkpointing_steps.py +0 -0
  247. {tactus-0.20.1 → tactus-0.21.1}/features/steps/control_flow_steps.py +0 -0
  248. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_agent_steps.py +0 -0
  249. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_history_steps.py +0 -0
  250. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_lm_steps.py +0 -0
  251. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_module_steps.py +0 -0
  252. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_prediction_steps.py +0 -0
  253. {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_signature_steps.py +0 -0
  254. {tactus-0.20.1 → tactus-0.21.1}/features/steps/file_operations_steps.py +0 -0
  255. {tactus-0.20.1 → tactus-0.21.1}/features/steps/human_in_the_loop_steps.py +0 -0
  256. {tactus-0.20.1 → tactus-0.21.1}/features/steps/ide_server_steps.py +0 -0
  257. {tactus-0.20.1 → tactus-0.21.1}/features/steps/json_operations_steps.py +0 -0
  258. {tactus-0.20.1 → tactus-0.21.1}/features/steps/logging_steps.py +0 -0
  259. {tactus-0.20.1 → tactus-0.21.1}/features/steps/lua_dsl_validation_steps.py +0 -0
  260. {tactus-0.20.1 → tactus-0.21.1}/features/steps/lua_integration_steps.py +0 -0
  261. {tactus-0.20.1 → tactus-0.21.1}/features/steps/mocking_steps.py +0 -0
  262. {tactus-0.20.1 → tactus-0.21.1}/features/steps/procedure_calls_steps.py +0 -0
  263. {tactus-0.20.1 → tactus-0.21.1}/features/steps/retry_logic_steps.py +0 -0
  264. {tactus-0.20.1 → tactus-0.21.1}/features/steps/session_management_steps.py +0 -0
  265. {tactus-0.20.1 → tactus-0.21.1}/features/steps/stage_tracking_steps.py +0 -0
  266. {tactus-0.20.1 → tactus-0.21.1}/features/steps/state_management_steps.py +0 -0
  267. {tactus-0.20.1 → tactus-0.21.1}/features/steps/storage_backend_steps.py +0 -0
  268. {tactus-0.20.1 → tactus-0.21.1}/features/steps/support/__init__.py +0 -0
  269. {tactus-0.20.1 → tactus-0.21.1}/features/steps/support/harnesses.py +0 -0
  270. {tactus-0.20.1 → tactus-0.21.1}/features/steps/tool_integration_steps.py +0 -0
  271. {tactus-0.20.1 → tactus-0.21.1}/features/steps/workflow_execution_steps.py +0 -0
  272. {tactus-0.20.1 → tactus-0.21.1}/scripts/audit_examples_mocking.py +0 -0
  273. {tactus-0.20.1 → tactus-0.21.1}/scripts/convert_examples.py +0 -0
  274. {tactus-0.20.1 → tactus-0.21.1}/start-web-ide.sh +0 -0
  275. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/__init__.py +0 -0
  276. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/cli_hitl.py +0 -0
  277. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/file_storage.py +0 -0
  278. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/ide_log.py +0 -0
  279. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/lua_tools.py +0 -0
  280. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/mcp.py +0 -0
  281. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/mcp_manager.py +0 -0
  282. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/memory.py +0 -0
  283. {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/plugins.py +0 -0
  284. {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/http_backend.py +0 -0
  285. {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/model_backend.py +0 -0
  286. {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/pytorch_backend.py +0 -0
  287. {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/__init__.py +0 -0
  288. {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/commands/__init__.py +0 -0
  289. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/__init__.py +0 -0
  290. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dependencies/__init__.py +0 -0
  291. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dependencies/registry.py +0 -0
  292. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/exceptions.py +0 -0
  293. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/lua_sandbox.py +0 -0
  294. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/message_history_manager.py +0 -0
  295. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/mocking.py +0 -0
  296. {tactus-0.20.1 → tactus-0.21.1}/tactus/core/template_resolver.py +0 -0
  297. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/__init__.py +0 -0
  298. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/config.py +0 -0
  299. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/history.py +0 -0
  300. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/module.py +0 -0
  301. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/prediction.py +0 -0
  302. {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/signature.py +0 -0
  303. {tactus-0.20.1 → tactus-0.21.1}/tactus/ide/__init__.py +0 -0
  304. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/control.py +0 -0
  305. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/file.py +0 -0
  306. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/human.py +0 -0
  307. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/json.py +0 -0
  308. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/log.py +0 -0
  309. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/message_history.py +0 -0
  310. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/model.py +0 -0
  311. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/procedure.py +0 -0
  312. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/procedure_callable.py +0 -0
  313. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/retry.py +0 -0
  314. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/session.py +0 -0
  315. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/stage.py +0 -0
  316. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/state.py +0 -0
  317. {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/toolset.py +0 -0
  318. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/chat_recorder.py +0 -0
  319. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/config.py +0 -0
  320. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/hitl.py +0 -0
  321. {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/storage.py +0 -0
  322. {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/__init__.py +0 -0
  323. {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/base.py +0 -0
  324. {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/bedrock.py +0 -0
  325. {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/google.py +0 -0
  326. {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/openai.py +0 -0
  327. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/__init__.py +0 -0
  328. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/__init__.py +0 -0
  329. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/csv.py +0 -0
  330. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/excel.py +0 -0
  331. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/file.py +0 -0
  332. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/hdf5.py +0 -0
  333. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/json.py +0 -0
  334. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/parquet.py +0 -0
  335. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/tsv.py +0 -0
  336. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/loader.py +0 -0
  337. {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
  338. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/__init__.py +0 -0
  339. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/behave_integration.py +0 -0
  340. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/context.py +0 -0
  341. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/eval_models.py +0 -0
  342. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/evaluation_runner.py +0 -0
  343. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/evaluators.py +0 -0
  344. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/events.py +0 -0
  345. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/gherkin_parser.py +0 -0
  346. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_dependencies.py +0 -0
  347. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_hitl.py +0 -0
  348. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_registry.py +0 -0
  349. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/models.py +0 -0
  350. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/pydantic_eval_runner.py +0 -0
  351. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/__init__.py +0 -0
  352. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/builtin.py +0 -0
  353. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/custom.py +0 -0
  354. {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/registry.py +0 -0
  355. {tactus-0.20.1 → tactus-0.21.1}/tactus/tracing/__init__.py +0 -0
  356. {tactus-0.20.1 → tactus-0.21.1}/tactus/tracing/trace_manager.py +0 -0
  357. {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/__init__.py +0 -0
  358. {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/cost_calculator.py +0 -0
  359. {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/model_pricing.py +0 -0
  360. {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/safe_file_library.py +0 -0
  361. {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/safe_libraries.py +0 -0
  362. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/LuaLexerBase.py +0 -0
  363. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/LuaParserBase.py +0 -0
  364. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/README.md +0 -0
  365. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/__init__.py +0 -0
  366. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/error_listener.py +0 -0
  367. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.interp +0 -0
  368. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.py +0 -0
  369. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
  370. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
  371. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.interp +0 -0
  372. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.py +0 -0
  373. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.tokens +0 -0
  374. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParserBase.py +0 -0
  375. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  376. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/__init__.py +0 -0
  377. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  378. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
  379. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/semantic_visitor.py +0 -0
  380. {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/validator.py +0 -0
  381. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/.gitignore +0 -0
  382. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/README.md +0 -0
  383. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
  384. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  385. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/backend/hook-lupa.py +0 -0
  386. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/backend/tactus_backend.spec +0 -0
  387. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/package-lock.json +0 -0
  388. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/package.json +0 -0
  389. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/preload/preload.ts +0 -0
  390. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/preload/tsconfig.json +0 -0
  391. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/rebuild-and-test.sh +0 -0
  392. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/scripts/build-backend.js +0 -0
  393. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/scripts/build-frontend.js +0 -0
  394. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/backend-manager.ts +0 -0
  395. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/main.ts +0 -0
  396. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/menu.ts +0 -0
  397. {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/tsconfig.json +0 -0
  398. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/ARCHITECTURE.md +0 -0
  399. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/CHANGELOG.md +0 -0
  400. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/DEV_MODE.md +0 -0
  401. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/QUICK_START.md +0 -0
  402. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/README.md +0 -0
  403. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  404. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
  405. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/README.md +0 -0
  406. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/events.py +0 -0
  407. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/logging_capture.py +0 -0
  408. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/lsp_server.py +0 -0
  409. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/requirements.txt +0 -0
  410. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  411. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/dev.sh +0 -0
  412. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
  413. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  414. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  415. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/README.md +0 -0
  416. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/demo.ts +0 -0
  417. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/index.html +0 -0
  418. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/jest.config.js +0 -0
  419. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/package.json +0 -0
  420. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/postcss.config.js +0 -0
  421. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
  422. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  423. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  424. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  425. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  426. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  427. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  428. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  429. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  430. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  431. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  432. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  433. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  434. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  435. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  436. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  437. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  438. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  439. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  440. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  441. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  442. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  443. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  444. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  445. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  446. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  447. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  448. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  449. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  450. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  451. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  452. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  453. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  454. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  455. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  456. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  457. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  458. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  459. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  460. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  461. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  462. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  463. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  464. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  465. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  466. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  467. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  468. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  469. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  470. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  471. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  472. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  473. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  474. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  475. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  476. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  477. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  478. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  479. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  480. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  481. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  482. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  483. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  484. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  485. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  486. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  487. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  488. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  489. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  490. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  491. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  492. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  493. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  494. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  495. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  496. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  497. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  498. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  499. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/index.css +0 -0
  500. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  501. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/main.tsx +0 -0
  502. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  503. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/results.ts +0 -0
  504. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  505. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  506. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  507. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  508. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
  509. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  510. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tailwind.config.js +0 -0
  511. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.json +0 -0
  512. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
  513. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/vite.config.ts +0 -0
  514. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  515. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/package.json +0 -0
  516. {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/start-dev.sh +0 -0
  517. {tactus-0.20.1 → tactus-0.21.1}/tests/__init__.py +0 -0
  518. {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/__init__.py +0 -0
  519. {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
  520. {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/test_plugins.py +0 -0
  521. {tactus-0.20.1 → tactus-0.21.1}/tests/cli/__init__.py +0 -0
  522. {tactus-0.20.1 → tactus-0.21.1}/tests/conftest.py +0 -0
  523. {tactus-0.20.1 → tactus-0.21.1}/tests/core/__init__.py +0 -0
  524. {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_config_manager.py +0 -0
  525. {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_determinism_safety.py +0 -0
  526. {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_lua_sandbox_security.py +0 -0
  527. {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_runtime_inputs.py +0 -0
  528. {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_script_mode.py +0 -0
  529. {tactus-0.20.1 → tactus-0.21.1}/tests/dspy/__init__.py +0 -0
  530. {tactus-0.20.1 → tactus-0.21.1}/tests/dspy/test_streaming.py +0 -0
  531. {tactus-0.20.1 → tactus-0.21.1}/tests/fixtures/__init__.py +0 -0
  532. {tactus-0.20.1 → tactus-0.21.1}/tests/fixtures/test_mcp_server.py +0 -0
  533. {tactus-0.20.1 → tactus-0.21.1}/tests/integration/test_named_procedures.py +0 -0
  534. {tactus-0.20.1 → tactus-0.21.1}/tests/mocks/__init__.py +0 -0
  535. {tactus-0.20.1 → tactus-0.21.1}/tests/mocks/llm_mocks.py +0 -0
  536. {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_retry_primitive.py +0 -0
  537. {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_state_primitive.py +0 -0
  538. {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_tool_primitive.py +0 -0
  539. {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_toolset_dsl.py +0 -0
  540. {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/__init__.py +0 -0
  541. {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/test_loader.py +0 -0
  542. {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/test_require_python.py +0 -0
  543. {tactus-0.20.1 → tactus-0.21.1}/tests/test_checkpoints_integration.py +0 -0
  544. {tactus-0.20.1 → tactus-0.21.1}/tests/test_tracing.py +0 -0
  545. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/__init__.py +0 -0
  546. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/conftest.py +0 -0
  547. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_e2e.py +0 -0
  548. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_gherkin_parser.py +0 -0
  549. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_integration.py +0 -0
  550. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_models.py +0 -0
  551. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_runtime_integration.py +0 -0
  552. {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_step_registry.py +0 -0
  553. {tactus-0.20.1 → tactus-0.21.1}/tests/utils/__init__.py +0 -0
  554. {tactus-0.20.1 → tactus-0.21.1}/tests/utils/test_safe_file_library.py +0 -0
  555. {tactus-0.20.1 → 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,8 @@ yarn-error.log*
37
37
  .tactus/config.yml
38
38
  progress.output
39
39
  .tac/
40
+ tmp/
41
+ examples/output/
40
42
 
41
43
  *storybook.log
42
44
  storybook-static
@@ -2,12 +2,52 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
- ## v0.20.1 (2026-01-10)
5
+ ## v0.21.1 (2026-01-10)
6
6
 
7
7
  ### Bug Fixes
8
8
 
9
- - Correct Toolset declaration syntax
10
- ([`c075c97`](https://github.com/AnthusAI/Tactus/commit/c075c97841c918187d83378224687155a4c2d924))
9
+ - **ci**: Add --skip-existing to twine upload
10
+ ([`7a1b369`](https://github.com/AnthusAI/Tactus/commit/7a1b369376ce68869b98f0faed877a52855b4459))
11
+
12
+
13
+ ## v0.21.0 (2026-01-10)
14
+
15
+ ### Bug Fixes
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
+
23
+ - Clarify summarization prompts are logged
24
+ ([`423b912`](https://github.com/AnthusAI/Tactus/commit/423b912c590cd7e9702a0e9dbb76288f26cdfd4a))
25
+
26
+ - Clarify template namespaces and rendering
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))
34
+
35
+ - Remove incompatible tests and skip deprecated YAML test
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))
40
+
41
+ - Support message alias for agent calls
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))
46
+
47
+ ### Chores
48
+
49
+ - Update .gitignore to include tmp/ directory
50
+ ([`1294360`](https://github.com/AnthusAI/Tactus/commit/1294360a261cec1ff8c35f8063ae2b652c340373))
11
51
 
12
52
 
13
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.20.1
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
  }
@@ -1883,12 +1876,12 @@ local web_search = Tool.get("web_search") -- From MCP server
1883
1876
  local result = web_search({query = "weather"})
1884
1877
  ```
1885
1878
 
1886
- ### Toolset with type="lua"
1879
+ ### toolset() with type="lua"
1887
1880
 
1888
1881
  Group multiple related tools into a named toolset:
1889
1882
 
1890
1883
  ```lua
1891
- Toolset "math_tools" {
1884
+ toolset("math_tools", {
1892
1885
  type = "lua",
1893
1886
  tools = {
1894
1887
  {
@@ -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
  ```
@@ -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
 
@@ -93,6 +93,138 @@ default_model: "gpt-4o-mini"
93
93
 
94
94
  **Security**: Sidecar files can contain file paths and command execution. Only use trusted sidecar files.
95
95
 
96
+ ## Sandbox Configuration
97
+
98
+ Tactus runs procedures in Docker containers by default for security isolation. You can configure sandbox behavior at any configuration level (user, project, or sidecar).
99
+
100
+ ### Basic Sandbox Settings
101
+
102
+ ```yaml
103
+ # ~/.tactus/config.yml or .tactus/config.yml
104
+ sandbox:
105
+ enabled: true # Default: true (if Docker available)
106
+ image: "tactus-sandbox:local" # Docker image name (auto-built on first use)
107
+ timeout: 3600 # Max execution time in seconds (default: 1 hour)
108
+ mcp_servers_path: "~/.tactus/mcp-servers" # Path to MCP servers
109
+ ```
110
+
111
+ **Note**: If Docker is unavailable and `enabled: true`, execution will fail with an error. Use `--no-sandbox` flag or `enabled: false` to explicitly run without isolation.
112
+
113
+ ### Resource Limits
114
+
115
+ Control memory and CPU usage per container:
116
+
117
+ ```yaml
118
+ sandbox:
119
+ limits:
120
+ memory: "2g" # Per-container memory limit (default: 2GB)
121
+ cpus: "2" # Per-container CPU cores (default: 2)
122
+ ```
123
+
124
+ **Error handling**:
125
+ - Out of memory: Container killed with exit code 137
126
+ - Timeout exceeded: Container killed with exit code 124
127
+
128
+ ### Network Configuration
129
+
130
+ Control network access for procedures:
131
+
132
+ ```yaml
133
+ sandbox:
134
+ network: "bridge" # Network mode (default: bridge)
135
+
136
+ # Options:
137
+ # - "bridge": Default Docker bridge (allows outbound connections)
138
+ # - "none": No network access (most secure, but can't call LLM APIs)
139
+ # - "host": Use host network (not recommended for security)
140
+ # - "custom-network": Use a custom Docker network
141
+ ```
142
+
143
+ **Security consideration**: Default `bridge` mode allows outbound connections (needed for LLM API calls), but agents could potentially exfiltrate data. See [Sandboxing Guide: Threat Model](./SANDBOXING.md#threat-model) for details.
144
+
145
+ ### Volume Mounts
146
+
147
+ Mount host directories into the container:
148
+
149
+ ```yaml
150
+ sandbox:
151
+ volumes:
152
+ - "/host/data:/data:ro" # Read-only mount
153
+ - "/host/outputs:/outputs:rw" # Read-write mount
154
+ - "/shared/config:/config:ro"
155
+ ```
156
+
157
+ **Default mounts** (always included):
158
+ - Workspace: Temporary directory at `/workspace` (ephemeral, destroyed after run)
159
+ - MCP Servers: `~/.tactus/mcp-servers` at `/mcp-servers` (read-only)
160
+
161
+ ### Environment Variables
162
+
163
+ Pass environment variables to the container:
164
+
165
+ ```yaml
166
+ sandbox:
167
+ env:
168
+ CUSTOM_VAR: "value"
169
+ DEBUG: "true"
170
+ LOG_LEVEL: "info"
171
+ ```
172
+
173
+ **Automatically passed through** (no configuration needed):
174
+ - `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`
175
+ - `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_DEFAULT_REGION`, `AWS_SESSION_TOKEN`
176
+ - `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`
177
+
178
+ ### Per-Procedure Sandbox Configuration
179
+
180
+ Use sidecar files to customize sandbox settings per procedure:
181
+
182
+ **Example**: `financial_analysis.tac.yml`
183
+ ```yaml
184
+ # Procedure-specific sandbox configuration
185
+ sandbox:
186
+ enabled: true
187
+
188
+ limits:
189
+ memory: "4g" # More memory for data-heavy processing
190
+ cpus: "4" # More CPU cores
191
+
192
+ timeout: 1800 # 30 minute timeout
193
+
194
+ network: "none" # No network access for sensitive data
195
+
196
+ volumes:
197
+ - "/data/financial:/data:ro" # Read-only financial data
198
+ - "/output/reports:/reports:rw" # Write reports here
199
+
200
+ env:
201
+ DATA_PATH: "/data"
202
+ OUTPUT_PATH: "/reports"
203
+ ```
204
+
205
+ **Use cases for per-procedure sandbox configs**:
206
+ - Higher resource limits for data-intensive procedures
207
+ - Network isolation for procedures handling sensitive data
208
+ - Custom volume mounts for specific data sources
209
+ - Procedure-specific environment variables
210
+
211
+ ### Disabling the Sandbox
212
+
213
+ To run without Docker isolation:
214
+
215
+ **Via CLI**:
216
+ ```bash
217
+ tactus run procedure.tac --no-sandbox
218
+ ```
219
+
220
+ **Via configuration**:
221
+ ```yaml
222
+ sandbox:
223
+ enabled: false
224
+ ```
225
+
226
+ **Security warning**: Running without sandbox removes OS-level isolation. Only disable for trusted procedures or development. See [Sandboxing Guide](./SANDBOXING.md) for security implications.
227
+
96
228
  ### Directory-Level Configuration
97
229
 
98
230
  You can place `.tactus/config.yml` files in any directory to configure settings for procedures in that directory and subdirectories.
@@ -322,6 +454,7 @@ api_key = config.get("openai_api_key")
322
454
 
323
455
  ## See Also
324
456
 
457
+ - [Sandboxing & Security](SANDBOXING.md) - Security concepts and threat models
325
458
  - [Tool Roadmap](TOOL_ROADMAP.md) - Information about tool loading
326
459
  - [README](../README.md) - General Tactus documentation
327
460
  - [Examples](../examples/) - Example procedures with sidecar configs
@@ -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?