tactus 0.15.0__tar.gz → 0.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. {tactus-0.15.0 → tactus-0.22.0}/.github/workflows/release.yml +2 -2
  2. {tactus-0.15.0 → tactus-0.22.0}/.gitignore +2 -0
  3. {tactus-0.15.0 → tactus-0.22.0}/AGENTS.md +12 -1
  4. {tactus-0.15.0 → tactus-0.22.0}/CHANGELOG.md +122 -0
  5. {tactus-0.15.0 → tactus-0.22.0}/IMPLEMENTATION.md +107 -103
  6. {tactus-0.15.0 → tactus-0.22.0}/PKG-INFO +142 -101
  7. {tactus-0.15.0 → tactus-0.22.0}/README.md +140 -98
  8. tactus-0.22.0/SPECIFICATION.md +3258 -0
  9. tactus-0.15.0/SPECIFICATION.md → tactus-0.22.0/SPECIFICATION.md.bak +696 -269
  10. tactus-0.22.0/TECHNICAL_DEBT.md +262 -0
  11. tactus-0.22.0/docs/AGENTS.md +22 -0
  12. {tactus-0.15.0 → tactus-0.22.0}/docs/BDD_TESTING.md +253 -12
  13. {tactus-0.15.0 → tactus-0.22.0}/docs/CONFIGURATION.md +153 -7
  14. {tactus-0.15.0 → tactus-0.22.0}/docs/DURABILITY.md +98 -71
  15. tactus-0.22.0/docs/SANDBOXING.md +499 -0
  16. tactus-0.22.0/docs/STREAMING.md +140 -0
  17. {tactus-0.15.0 → tactus-0.22.0}/docs/TOOLS.md +281 -263
  18. {tactus-0.15.0 → tactus-0.22.0}/docs/TOOL_ROADMAP.md +20 -20
  19. tactus-0.22.0/examples/01-basics-hello-world.tac +9 -0
  20. {tactus-0.15.0 → tactus-0.22.0}/examples/02-basics-simple-logic.tac +20 -25
  21. {tactus-0.15.0 → tactus-0.22.0}/examples/03-basics-parameters.tac +18 -21
  22. tactus-0.22.0/examples/04-basics-simple-agent.tac +71 -0
  23. {tactus-0.15.0 → tactus-0.22.0}/examples/05-basics-multi-model.tac +39 -20
  24. tactus-0.22.0/examples/06-basics-streaming.tac +33 -0
  25. tactus-0.22.0/examples/07-basics-bedrock.tac +91 -0
  26. tactus-0.22.0/examples/08-basics-models.tac +285 -0
  27. tactus-0.22.0/examples/09-basics-google-gemini.tac +154 -0
  28. tactus-0.22.0/examples/10-feature-state.tac +58 -0
  29. tactus-0.22.0/examples/11-feature-message-history.tac +73 -0
  30. {tactus-0.15.0 → tactus-0.22.0}/examples/12-feature-structured-output.tac +39 -40
  31. tactus-0.22.0/examples/13-feature-session.tac +73 -0
  32. tactus-0.22.0/examples/14-feature-per-turn-tools-simple.tac +53 -0
  33. tactus-0.22.0/examples/14-feature-per-turn-tools.tac +140 -0
  34. {tactus-0.15.0 → tactus-0.22.0}/examples/15-feature-local-tools.tac +45 -46
  35. tactus-0.22.0/examples/16-feature-toolsets-advanced.tac +187 -0
  36. tactus-0.22.0/examples/17-feature-toolsets-dsl.tac +130 -0
  37. {tactus-0.15.0 → tactus-0.22.0}/examples/18-feature-lua-tools-individual.tac +49 -39
  38. {tactus-0.15.0 → tactus-0.22.0}/examples/18-feature-lua-tools-inline.tac +62 -48
  39. {tactus-0.15.0 → tactus-0.22.0}/examples/18-feature-lua-tools-toolset.tac +50 -37
  40. tactus-0.22.0/examples/19-feature-direct-tool-calls.tac +156 -0
  41. tactus-0.22.0/examples/20-bdd-complete.tac +135 -0
  42. tactus-0.15.0/examples/20-bdd-complete.tac → tactus-0.22.0/examples/20-bdd-complete.tac.bak +50 -54
  43. tactus-0.22.0/examples/20-bdd-complete.tac.bak2 +122 -0
  44. tactus-0.22.0/examples/21-bdd-passing.tac +102 -0
  45. tactus-0.15.0/examples/21-bdd-passing.tac → tactus-0.22.0/examples/21-bdd-passing.tac.bak +34 -37
  46. tactus-0.22.0/examples/21-bdd-passing.tac.bak2 +92 -0
  47. {tactus-0.15.0 → tactus-0.22.0}/examples/30-eval-simple.tac +12 -13
  48. {tactus-0.15.0 → tactus-0.22.0}/examples/31-eval-demo.tac +43 -21
  49. {tactus-0.15.0 → tactus-0.22.0}/examples/32-eval-success-rate.tac +53 -31
  50. {tactus-0.15.0 → tactus-0.22.0}/examples/33-eval-thresholds.tac +41 -20
  51. {tactus-0.15.0 → tactus-0.22.0}/examples/34-eval-dataset.tac +46 -25
  52. tactus-0.22.0/examples/35-eval-trace.tac +154 -0
  53. tactus-0.22.0/examples/35-eval-trace.tac.bak +132 -0
  54. tactus-0.15.0/examples/35-eval-trace.tac → tactus-0.22.0/examples/35-eval-trace.tac.bak2 +50 -37
  55. {tactus-0.15.0 → tactus-0.22.0}/examples/36-eval-advanced.tac +39 -23
  56. tactus-0.22.0/examples/37-eval-comprehensive.tac +145 -0
  57. tactus-0.15.0/examples/37-eval-comprehensive.tac → tactus-0.22.0/examples/37-eval-comprehensive.tac.bak +44 -32
  58. tactus-0.22.0/examples/37-eval-comprehensive.tac.bak2 +129 -0
  59. tactus-0.22.0/examples/39-model-simple.tac +42 -0
  60. {tactus-0.15.0 → tactus-0.22.0}/examples/40-mcp-test.tac +41 -40
  61. tactus-0.22.0/examples/40-model-text-classifier.tac +99 -0
  62. {tactus-0.15.0 → tactus-0.22.0}/examples/41-mcp-simple.tac +25 -24
  63. tactus-0.22.0/examples/41-model-pytorch.tac +90 -0
  64. tactus-0.22.0/examples/43-sub-procedure-simple.tac +54 -0
  65. tactus-0.22.0/examples/44-sub-procedure-composition.tac +105 -0
  66. tactus-0.22.0/examples/45-sub-procedure-recursive.tac +37 -0
  67. tactus-0.22.0/examples/46-checkpoint-explicit.tac +51 -0
  68. tactus-0.22.0/examples/47-checkpoint-expensive-ops.tac +46 -0
  69. tactus-0.22.0/examples/48-script-mode-simple.tac +21 -0
  70. tactus-0.22.0/examples/50-inputs-showcase.tac +66 -0
  71. tactus-0.22.0/examples/51-inputs-calculator.tac +82 -0
  72. tactus-0.22.0/examples/52-file-io-basics.tac +93 -0
  73. tactus-0.22.0/examples/53-tsv-file-io.tac +87 -0
  74. tactus-0.22.0/examples/54-json-file-io.tac +141 -0
  75. tactus-0.22.0/examples/55-parquet-file-io.tac +129 -0
  76. tactus-0.22.0/examples/56-hdf5-file-io.tac +109 -0
  77. tactus-0.22.0/examples/57-excel-file-io.tac +154 -0
  78. tactus-0.22.0/examples/58-text-file-io.tac +224 -0
  79. tactus-0.22.0/examples/60-tool-sources.tac +122 -0
  80. tactus-0.22.0/examples/61-inline-toolset-lua.tac +167 -0
  81. tactus-0.22.0/examples/62-mcp-toolset-by-server.tac +177 -0
  82. tactus-0.22.0/examples/63-toolset-import-from-file.tac +167 -0
  83. tactus-0.22.0/examples/64-require-modules.tac +57 -0
  84. {tactus-0.15.0 → tactus-0.22.0}/examples/65-optional-state-demo.tac +30 -24
  85. tactus-0.22.0/examples/70-mocking-static.tac +150 -0
  86. tactus-0.22.0/examples/71-mocking-temporal.tac +135 -0
  87. tactus-0.22.0/examples/72-mocking-conditional.tac +155 -0
  88. tactus-0.22.0/examples/99-misc-test-loading.tac +20 -0
  89. tactus-0.22.0/examples/app_config.ini +26 -0
  90. tactus-0.22.0/examples/demo_output.json +11 -0
  91. tactus-0.22.0/examples/helpers/math_module.tac +39 -0
  92. tactus-0.22.0/examples/helpers/product.tac +18 -0
  93. tactus-0.22.0/examples/helpers/string_module.tac +35 -0
  94. tactus-0.22.0/examples/helpers/sum.tac +18 -0
  95. {tactus-0.15.0 → tactus-0.22.0}/examples/helpers/text_tools.tac +4 -4
  96. tactus-0.22.0/examples/inventory_summary.tsv +4 -0
  97. tactus-0.22.0/examples/output_summary.txt +1 -0
  98. {tactus-0.15.0 → tactus-0.22.0}/examples/tools/data_analysis.py +1 -1
  99. {tactus-0.15.0 → tactus-0.22.0}/examples/tools/search.py +2 -2
  100. {tactus-0.15.0 → tactus-0.22.0}/examples/with_dependencies/simple_http_test.tac +15 -22
  101. {tactus-0.15.0 → tactus-0.22.0}/examples/with_dependencies/time_lookup.tac +15 -21
  102. {tactus-0.15.0 → tactus-0.22.0}/features/17_lua_dsl_validation.feature +6 -21
  103. {tactus-0.15.0 → tactus-0.22.0}/features/18_example_procedures.feature +0 -2
  104. {tactus-0.15.0 → tactus-0.22.0}/features/20_parameters.feature +12 -12
  105. {tactus-0.15.0 → tactus-0.22.0}/features/21_outputs.feature +12 -12
  106. {tactus-0.15.0 → tactus-0.22.0}/features/23_prompts.feature +4 -4
  107. {tactus-0.15.0 → tactus-0.22.0}/features/24_bdd_specifications.feature +9 -9
  108. {tactus-0.15.0 → tactus-0.22.0}/features/25_bdd_custom_steps.feature +3 -3
  109. {tactus-0.15.0 → tactus-0.22.0}/features/26_bdd_evaluation.feature +8 -8
  110. {tactus-0.15.0 → tactus-0.22.0}/features/27_default_settings.feature +6 -6
  111. {tactus-0.15.0 → tactus-0.22.0}/features/28_custom_prompts.feature +5 -5
  112. {tactus-0.15.0 → tactus-0.22.0}/features/29_execution_settings.feature +5 -5
  113. {tactus-0.15.0 → tactus-0.22.0}/features/30_session_filters.feature +5 -5
  114. {tactus-0.15.0 → tactus-0.22.0}/features/31_matchers.feature +5 -5
  115. {tactus-0.15.0 → tactus-0.22.0}/features/32_result_object.feature +6 -8
  116. {tactus-0.15.0 → tactus-0.22.0}/features/42_model_primitive.feature +9 -9
  117. {tactus-0.15.0 → tactus-0.22.0}/features/46_explicit_checkpoint.feature +2 -2
  118. tactus-0.22.0/features/51_dspy_lm_config.feature +199 -0
  119. tactus-0.22.0/features/52_dspy_signature.feature +302 -0
  120. tactus-0.22.0/features/53_dspy_module.feature +322 -0
  121. tactus-0.22.0/features/54_dspy_history.feature +302 -0
  122. tactus-0.22.0/features/55_dspy_prediction.feature +295 -0
  123. tactus-0.22.0/features/56_dspy_agent.feature +323 -0
  124. {tactus-0.15.0 → tactus-0.22.0}/features/documentation/Lua DSL/README.md +18 -18
  125. {tactus-0.15.0 → tactus-0.22.0}/features/steps/agent_primitives_steps.py +16 -5
  126. tactus-0.22.0/features/steps/dspy_agent_steps.py +832 -0
  127. tactus-0.22.0/features/steps/dspy_history_steps.py +652 -0
  128. tactus-0.22.0/features/steps/dspy_lm_steps.py +351 -0
  129. tactus-0.22.0/features/steps/dspy_module_steps.py +499 -0
  130. tactus-0.22.0/features/steps/dspy_prediction_steps.py +811 -0
  131. tactus-0.22.0/features/steps/dspy_signature_steps.py +381 -0
  132. {tactus-0.15.0 → tactus-0.22.0}/features/steps/example_procedures_steps.py +5 -0
  133. {tactus-0.15.0 → tactus-0.22.0}/features/steps/lua_dsl_validation_steps.py +9 -2
  134. {tactus-0.15.0 → tactus-0.22.0}/features/steps/result_and_output_steps.py +17 -7
  135. {tactus-0.15.0 → tactus-0.22.0}/pyproject.toml +2 -2
  136. tactus-0.22.0/scripts/audit_examples_mocking.py +229 -0
  137. tactus-0.22.0/scripts/convert_examples.py +213 -0
  138. {tactus-0.15.0 → tactus-0.22.0}/tactus/__init__.py +1 -1
  139. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/cli_log.py +25 -0
  140. tactus-0.22.0/tactus/adapters/http_callback_log.py +109 -0
  141. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/ide_log.py +10 -1
  142. {tactus-0.15.0 → tactus-0.22.0}/tactus/cli/app.py +249 -64
  143. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/config_manager.py +77 -7
  144. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/dependencies/registry.py +2 -3
  145. tactus-0.22.0/tactus/core/dsl_stubs.py +1796 -0
  146. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/execution_context.py +8 -0
  147. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/lua_sandbox.py +139 -41
  148. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/output_validator.py +3 -6
  149. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/registry.py +47 -3
  150. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/runtime.py +263 -158
  151. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/yaml_parser.py +11 -1
  152. tactus-0.22.0/tactus/docker/Dockerfile +57 -0
  153. tactus-0.22.0/tactus/docker/entrypoint.sh +68 -0
  154. {tactus-0.15.0 → tactus-0.22.0}/tactus/dspy/__init__.py +2 -1
  155. tactus-0.22.0/tactus/dspy/agent.py +962 -0
  156. {tactus-0.15.0 → tactus-0.22.0}/tactus/dspy/config.py +34 -0
  157. tactus-0.22.0/tactus/dspy/history.py +196 -0
  158. tactus-0.22.0/tactus/dspy/module.py +270 -0
  159. {tactus-0.15.0 → tactus-0.22.0}/tactus/dspy/prediction.py +110 -0
  160. {tactus-0.15.0 → tactus-0.22.0}/tactus/dspy/signature.py +33 -0
  161. tactus-0.22.0/tactus/ide/coding_assistant.py +343 -0
  162. {tactus-0.15.0 → tactus-0.22.0}/tactus/ide/server.py +497 -65
  163. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/__init__.py +2 -0
  164. tactus-0.22.0/tactus/primitives/handles.py +346 -0
  165. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/model.py +23 -3
  166. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/procedure.py +24 -3
  167. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/procedure_callable.py +46 -54
  168. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/step.py +57 -0
  169. tactus-0.22.0/tactus/primitives/system.py +93 -0
  170. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/tool.py +4 -2
  171. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/tool_handle.py +114 -0
  172. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/__init__.py +7 -0
  173. tactus-0.22.0/tactus/protocols/cost.py +31 -0
  174. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/log_handler.py +2 -2
  175. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/models.py +15 -1
  176. tactus-0.22.0/tactus/protocols/result.py +33 -0
  177. tactus-0.22.0/tactus/sandbox/__init__.py +63 -0
  178. tactus-0.22.0/tactus/sandbox/config.py +121 -0
  179. tactus-0.22.0/tactus/sandbox/container_runner.py +391 -0
  180. tactus-0.22.0/tactus/sandbox/docker_manager.py +321 -0
  181. tactus-0.22.0/tactus/sandbox/entrypoint.py +186 -0
  182. tactus-0.22.0/tactus/sandbox/protocol.py +222 -0
  183. tactus-0.22.0/tactus/stdlib/__init__.py +10 -0
  184. tactus-0.22.0/tactus/stdlib/io/__init__.py +13 -0
  185. tactus-0.22.0/tactus/stdlib/io/csv.py +88 -0
  186. tactus-0.22.0/tactus/stdlib/io/excel.py +136 -0
  187. tactus-0.22.0/tactus/stdlib/io/file.py +90 -0
  188. tactus-0.22.0/tactus/stdlib/io/hdf5.py +121 -0
  189. tactus-0.22.0/tactus/stdlib/io/json.py +109 -0
  190. tactus-0.22.0/tactus/stdlib/io/parquet.py +83 -0
  191. tactus-0.22.0/tactus/stdlib/io/tsv.py +88 -0
  192. tactus-0.22.0/tactus/stdlib/loader.py +274 -0
  193. tactus-0.22.0/tactus/stdlib/tac/tactus/tools/done.tac +33 -0
  194. tactus-0.22.0/tactus/stdlib/tac/tactus/tools/log.tac +49 -0
  195. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/README.md +6 -2
  196. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/behave_integration.py +15 -2
  197. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/context.py +18 -0
  198. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/evaluation_runner.py +1 -1
  199. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/gherkin_parser.py +2 -3
  200. tactus-0.22.0/tactus/testing/mock_agent.py +223 -0
  201. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/mock_hitl.py +1 -1
  202. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/mock_tools.py +18 -7
  203. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/models.py +2 -2
  204. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/steps/builtin.py +79 -1
  205. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/test_runner.py +35 -5
  206. {tactus-0.15.0 → tactus-0.22.0}/tactus/tracing/trace_manager.py +1 -1
  207. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/LuaLexerBase.py +0 -1
  208. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/LuaParserBase.py +0 -1
  209. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaLexer.py +0 -1
  210. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaLexerBase.py +0 -1
  211. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaParser.py +6 -32
  212. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaParserBase.py +0 -1
  213. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaParserVisitor.py +0 -1
  214. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/__init__.py +1 -1
  215. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/semantic_visitor.py +243 -40
  216. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/ARCHITECTURE.md +3 -3
  217. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/README.md +1 -1
  218. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/test_lsp_server.py +4 -4
  219. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/README.md +2 -2
  220. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/demo.ts +1 -1
  221. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/package-lock.json +1471 -2095
  222. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/App.tsx +98 -10
  223. tactus-0.22.0/tactus-ide/frontend/src/components/ChatSidebar.tsx +195 -0
  224. tactus-0.22.0/tactus-ide/frontend/src/components/MessageFeed.tsx +158 -0
  225. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +49 -26
  226. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +7 -7
  227. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +31 -2
  228. tactus-0.22.0/tactus-ide/frontend/src/components/TestOptionsModal.tsx +185 -0
  229. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +1 -1
  230. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +6 -5
  231. tactus-0.22.0/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +194 -0
  232. tactus-0.22.0/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +95 -0
  233. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +2 -2
  234. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +15 -21
  235. tactus-0.22.0/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +42 -0
  236. tactus-0.22.0/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +262 -0
  237. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +1 -1
  238. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +9 -2
  239. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +9 -2
  240. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +91 -16
  241. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/types/events.ts +18 -1
  242. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/types/metadata.ts +2 -2
  243. {tactus-0.15.0 → tactus-0.22.0}/tests/cli/test_cli.py +14 -14
  244. {tactus-0.15.0 → tactus-0.22.0}/tests/cli/test_cli_inputs.py +31 -20
  245. {tactus-0.15.0 → tactus-0.22.0}/tests/core/test_lua_sandbox_security.py +23 -6
  246. {tactus-0.15.0 → tactus-0.22.0}/tests/core/test_runtime_inputs.py +20 -20
  247. tactus-0.22.0/tests/core/test_script_mode.py +206 -0
  248. tactus-0.22.0/tests/dspy/__init__.py +1 -0
  249. tactus-0.22.0/tests/dspy/test_module_parameter.py +142 -0
  250. tactus-0.22.0/tests/dspy/test_streaming.py +276 -0
  251. tactus-0.22.0/tests/primitives/test_checkpoint_primitive.py +48 -0
  252. tactus-0.22.0/tests/primitives/test_system_alert.py +73 -0
  253. tactus-0.22.0/tests/stdlib/__init__.py +1 -0
  254. tactus-0.22.0/tests/stdlib/test_loader.py +180 -0
  255. tactus-0.22.0/tests/stdlib/test_require_python.py +228 -0
  256. {tactus-0.15.0 → tactus-0.22.0}/tests/test_mcp_integration.py +3 -6
  257. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_all_examples.py +91 -19
  258. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_e2e.py +10 -10
  259. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_gherkin_parser.py +3 -3
  260. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_models.py +9 -9
  261. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_runtime_integration.py +22 -15
  262. {tactus-0.15.0 → tactus-0.22.0}/tests/utils/test_safe_file_library.py +12 -8
  263. tactus-0.15.0/docs/STREAMING.md +0 -107
  264. tactus-0.15.0/examples/01-basics-hello-world.tac +0 -53
  265. tactus-0.15.0/examples/04-basics-simple-agent.tac +0 -78
  266. tactus-0.15.0/examples/06-basics-streaming.tac +0 -50
  267. tactus-0.15.0/examples/07-basics-bedrock.tac +0 -83
  268. tactus-0.15.0/examples/08-basics-models.tac +0 -241
  269. tactus-0.15.0/examples/09-basics-google-gemini.tac +0 -141
  270. tactus-0.15.0/examples/10-feature-state.tac +0 -55
  271. tactus-0.15.0/examples/11-feature-message-history.tac +0 -71
  272. tactus-0.15.0/examples/13-feature-session.tac +0 -71
  273. tactus-0.15.0/examples/14-feature-per-turn-tools-simple.tac +0 -53
  274. tactus-0.15.0/examples/14-feature-per-turn-tools.tac +0 -129
  275. tactus-0.15.0/examples/15-feature-local-tools.tac.yml +0 -11
  276. tactus-0.15.0/examples/16-feature-toolsets-advanced.tac +0 -165
  277. tactus-0.15.0/examples/16-feature-toolsets-advanced.tac.yml +0 -33
  278. tactus-0.15.0/examples/17-feature-toolsets-dsl.tac +0 -115
  279. tactus-0.15.0/examples/17-feature-toolsets-dsl.tac.yml +0 -6
  280. tactus-0.15.0/examples/19-feature-direct-tool-calls.tac +0 -143
  281. tactus-0.15.0/examples/39-model-simple.tac +0 -40
  282. tactus-0.15.0/examples/40-model-text-classifier.tac +0 -83
  283. tactus-0.15.0/examples/41-model-pytorch.tac +0 -76
  284. tactus-0.15.0/examples/43-sub-procedure-simple.tac +0 -59
  285. tactus-0.15.0/examples/44-sub-procedure-composition.tac +0 -116
  286. tactus-0.15.0/examples/45-sub-procedure-recursive.tac +0 -78
  287. tactus-0.15.0/examples/46-checkpoint-explicit.tac +0 -98
  288. tactus-0.15.0/examples/47-checkpoint-expensive-ops.tac +0 -83
  289. tactus-0.15.0/examples/48-script-mode-simple.tac +0 -19
  290. tactus-0.15.0/examples/50-inputs-showcase.tac +0 -69
  291. tactus-0.15.0/examples/51-inputs-calculator.tac +0 -80
  292. tactus-0.15.0/examples/52-file-io-basics.tac +0 -87
  293. tactus-0.15.0/examples/53-tsv-file-io.tac +0 -83
  294. tactus-0.15.0/examples/54-json-file-io.tac +0 -136
  295. tactus-0.15.0/examples/55-parquet-file-io.tac +0 -125
  296. tactus-0.15.0/examples/56-hdf5-file-io.tac +0 -146
  297. tactus-0.15.0/examples/57-excel-file-io.tac +0 -150
  298. tactus-0.15.0/examples/58-text-file-io.tac +0 -215
  299. tactus-0.15.0/examples/60-tool-sources.tac +0 -120
  300. tactus-0.15.0/examples/61-inline-toolset-lua.tac +0 -161
  301. tactus-0.15.0/examples/62-mcp-toolset-by-server.tac +0 -173
  302. tactus-0.15.0/examples/63-toolset-import-from-file.tac +0 -164
  303. tactus-0.15.0/examples/70-mocking-static.tac +0 -146
  304. tactus-0.15.0/examples/71-mocking-temporal.tac +0 -132
  305. tactus-0.15.0/examples/72-mocking-conditional.tac +0 -168
  306. tactus-0.15.0/examples/99-misc-test-loading.tac +0 -15
  307. tactus-0.15.0/examples/helpers/product.tac +0 -22
  308. tactus-0.15.0/examples/helpers/sum.tac +0 -22
  309. tactus-0.15.0/features/50_dspy_integration.feature +0 -108
  310. tactus-0.15.0/features/documentation/Lua DSL/PLAN.md +0 -243
  311. tactus-0.15.0/features/steps/dspy_integration_steps.py +0 -488
  312. tactus-0.15.0/features/steps/storage_backend_steps.py.bak +0 -343
  313. tactus-0.15.0/tactus/core/dsl_stubs.py +0 -1242
  314. tactus-0.15.0/tactus/dspy/agent.py +0 -244
  315. tactus-0.15.0/tactus/dspy/history.py +0 -114
  316. tactus-0.15.0/tactus/dspy/module.py +0 -127
  317. tactus-0.15.0/tactus/primitives/_deprecated_pydantic_ai/agent.py +0 -1318
  318. tactus-0.15.0/tactus/primitives/_deprecated_pydantic_ai/deps_generator.py +0 -106
  319. tactus-0.15.0/tactus/primitives/_deprecated_pydantic_ai/result.py +0 -260
  320. tactus-0.15.0/tactus/primitives/_deprecated_pydantic_ai/test_agent_tool_integration.py +0 -439
  321. tactus-0.15.0/tactus/primitives/_deprecated_pydantic_ai/test_tool_error_handling.py +0 -371
  322. tactus-0.15.0/tactus/primitives/handles.py +0 -223
  323. tactus-0.15.0/tactus/stdlib/__init__.py +0 -97
  324. tactus-0.15.0/tactus/stdlib/done/__init__.py +0 -39
  325. tactus-0.15.0/tactus/stdlib/file/__init__.py +0 -230
  326. tactus-0.15.0/tactus/stdlib/http/__init__.py +0 -197
  327. tactus-0.15.0/tactus/stdlib/log/__init__.py +0 -65
  328. tactus-0.15.0/tactus/stdlib/tools/done.tac +0 -21
  329. tactus-0.15.0/tactus/testing/mock_agent.py +0 -69
  330. tactus-0.15.0/tactus/validation/grammar/Lua.g4 +0 -1439
  331. tactus-0.15.0/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -83
  332. tactus-0.15.0/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -29
  333. {tactus-0.15.0 → tactus-0.22.0}/.claude/agents.md +0 -0
  334. {tactus-0.15.0 → tactus-0.22.0}/.github/workflows/desktop-release.yml +0 -0
  335. {tactus-0.15.0 → tactus-0.22.0}/.tactus/config.yml.example +0 -0
  336. {tactus-0.15.0 → tactus-0.22.0}/LICENSE +0 -0
  337. {tactus-0.15.0 → tactus-0.22.0}/Makefile +0 -0
  338. {tactus-0.15.0 → tactus-0.22.0}/behave.ini +0 -0
  339. {tactus-0.15.0 → tactus-0.22.0}/docs/FILE_IO.md +0 -0
  340. {tactus-0.15.0 → tactus-0.22.0}/examples/.tactus/config.yml +0 -0
  341. {tactus-0.15.0 → tactus-0.22.0}/examples/34-eval-dataset.jsonl +0 -0
  342. {tactus-0.15.0 → tactus-0.22.0}/examples/README.md +0 -0
  343. {tactus-0.15.0 → tactus-0.22.0}/examples/data/sample.csv +0 -0
  344. {tactus-0.15.0 → tactus-0.22.0}/examples/mock-config.json +0 -0
  345. {tactus-0.15.0 → tactus-0.22.0}/examples/models/README.md +0 -0
  346. {tactus-0.15.0 → tactus-0.22.0}/examples/models/create_sentiment_model.py +0 -0
  347. {tactus-0.15.0 → tactus-0.22.0}/examples/tools/calculations.py +0 -0
  348. {tactus-0.15.0 → tactus-0.22.0}/examples/with_dependencies/README.md +0 -0
  349. {tactus-0.15.0 → tactus-0.22.0}/features/01_state_management.feature +0 -0
  350. {tactus-0.15.0 → tactus-0.22.0}/features/02_checkpointing.feature +0 -0
  351. {tactus-0.15.0 → tactus-0.22.0}/features/03_human_in_the_loop.feature +0 -0
  352. {tactus-0.15.0 → tactus-0.22.0}/features/04_control_flow.feature +0 -0
  353. {tactus-0.15.0 → tactus-0.22.0}/features/05_tool_integration.feature +0 -0
  354. {tactus-0.15.0 → tactus-0.22.0}/features/06_retry_logic.feature +0 -0
  355. {tactus-0.15.0 → tactus-0.22.0}/features/07_file_operations.feature +0 -0
  356. {tactus-0.15.0 → tactus-0.22.0}/features/08_agent_primitives.feature +0 -0
  357. {tactus-0.15.0 → tactus-0.22.0}/features/09_workflow_execution.feature +0 -0
  358. {tactus-0.15.0 → tactus-0.22.0}/features/10_lua_integration.feature +0 -0
  359. {tactus-0.15.0 → tactus-0.22.0}/features/11_storage_backends.feature +0 -0
  360. {tactus-0.15.0 → tactus-0.22.0}/features/12_json_operations.feature +0 -0
  361. {tactus-0.15.0 → tactus-0.22.0}/features/13_logging.feature +0 -0
  362. {tactus-0.15.0 → tactus-0.22.0}/features/14_stage_and_step_tracking.feature +0 -0
  363. {tactus-0.15.0 → tactus-0.22.0}/features/15_procedure_calls.feature +0 -0
  364. {tactus-0.15.0 → tactus-0.22.0}/features/16_session_management.feature +0 -0
  365. {tactus-0.15.0 → tactus-0.22.0}/features/19_ide_server.feature +0 -0
  366. {tactus-0.15.0 → tactus-0.22.0}/features/33_output_type.feature +0 -0
  367. {tactus-0.15.0 → tactus-0.22.0}/features/43_sub_procedure_checkpointing.feature +0 -0
  368. {tactus-0.15.0 → tactus-0.22.0}/features/48_script_mode.feature +0 -0
  369. {tactus-0.15.0 → tactus-0.22.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  370. {tactus-0.15.0 → tactus-0.22.0}/features/environment.py +0 -0
  371. {tactus-0.15.0 → tactus-0.22.0}/features/steps/checkpointing_steps.py +0 -0
  372. {tactus-0.15.0 → tactus-0.22.0}/features/steps/control_flow_steps.py +0 -0
  373. {tactus-0.15.0 → tactus-0.22.0}/features/steps/file_operations_steps.py +0 -0
  374. {tactus-0.15.0 → tactus-0.22.0}/features/steps/human_in_the_loop_steps.py +0 -0
  375. {tactus-0.15.0 → tactus-0.22.0}/features/steps/ide_server_steps.py +0 -0
  376. {tactus-0.15.0 → tactus-0.22.0}/features/steps/json_operations_steps.py +0 -0
  377. {tactus-0.15.0 → tactus-0.22.0}/features/steps/logging_steps.py +0 -0
  378. {tactus-0.15.0 → tactus-0.22.0}/features/steps/lua_integration_steps.py +0 -0
  379. {tactus-0.15.0 → tactus-0.22.0}/features/steps/mocking_steps.py +0 -0
  380. {tactus-0.15.0 → tactus-0.22.0}/features/steps/procedure_calls_steps.py +0 -0
  381. {tactus-0.15.0 → tactus-0.22.0}/features/steps/retry_logic_steps.py +0 -0
  382. {tactus-0.15.0 → tactus-0.22.0}/features/steps/session_management_steps.py +0 -0
  383. {tactus-0.15.0 → tactus-0.22.0}/features/steps/stage_tracking_steps.py +0 -0
  384. {tactus-0.15.0 → tactus-0.22.0}/features/steps/state_management_steps.py +0 -0
  385. {tactus-0.15.0 → tactus-0.22.0}/features/steps/storage_backend_steps.py +0 -0
  386. {tactus-0.15.0 → tactus-0.22.0}/features/steps/support/__init__.py +0 -0
  387. {tactus-0.15.0 → tactus-0.22.0}/features/steps/support/harnesses.py +0 -0
  388. {tactus-0.15.0 → tactus-0.22.0}/features/steps/tool_integration_steps.py +0 -0
  389. {tactus-0.15.0 → tactus-0.22.0}/features/steps/workflow_execution_steps.py +0 -0
  390. {tactus-0.15.0 → tactus-0.22.0}/start-web-ide.sh +0 -0
  391. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/__init__.py +0 -0
  392. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/cli_hitl.py +0 -0
  393. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/file_storage.py +0 -0
  394. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/lua_tools.py +0 -0
  395. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/mcp.py +0 -0
  396. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/mcp_manager.py +0 -0
  397. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/memory.py +0 -0
  398. {tactus-0.15.0 → tactus-0.22.0}/tactus/adapters/plugins.py +0 -0
  399. {tactus-0.15.0 → tactus-0.22.0}/tactus/backends/http_backend.py +0 -0
  400. {tactus-0.15.0 → tactus-0.22.0}/tactus/backends/model_backend.py +0 -0
  401. {tactus-0.15.0 → tactus-0.22.0}/tactus/backends/pytorch_backend.py +0 -0
  402. {tactus-0.15.0 → tactus-0.22.0}/tactus/cli/__init__.py +0 -0
  403. {tactus-0.15.0 → tactus-0.22.0}/tactus/cli/commands/__init__.py +0 -0
  404. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/__init__.py +0 -0
  405. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/dependencies/__init__.py +0 -0
  406. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/exceptions.py +0 -0
  407. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/message_history_manager.py +0 -0
  408. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/mocking.py +0 -0
  409. {tactus-0.15.0 → tactus-0.22.0}/tactus/core/template_resolver.py +0 -0
  410. {tactus-0.15.0 → tactus-0.22.0}/tactus/ide/__init__.py +0 -0
  411. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/control.py +0 -0
  412. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/file.py +0 -0
  413. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/human.py +0 -0
  414. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/json.py +0 -0
  415. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/log.py +0 -0
  416. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/message_history.py +0 -0
  417. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/retry.py +0 -0
  418. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/session.py +0 -0
  419. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/stage.py +0 -0
  420. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/state.py +0 -0
  421. {tactus-0.15.0 → tactus-0.22.0}/tactus/primitives/toolset.py +0 -0
  422. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/chat_recorder.py +0 -0
  423. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/config.py +0 -0
  424. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/hitl.py +0 -0
  425. {tactus-0.15.0 → tactus-0.22.0}/tactus/protocols/storage.py +0 -0
  426. {tactus-0.15.0 → tactus-0.22.0}/tactus/providers/__init__.py +0 -0
  427. {tactus-0.15.0 → tactus-0.22.0}/tactus/providers/base.py +0 -0
  428. {tactus-0.15.0 → tactus-0.22.0}/tactus/providers/bedrock.py +0 -0
  429. {tactus-0.15.0 → tactus-0.22.0}/tactus/providers/google.py +0 -0
  430. {tactus-0.15.0 → tactus-0.22.0}/tactus/providers/openai.py +0 -0
  431. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/__init__.py +0 -0
  432. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/eval_models.py +0 -0
  433. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/evaluators.py +0 -0
  434. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/events.py +0 -0
  435. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/mock_dependencies.py +0 -0
  436. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/mock_registry.py +0 -0
  437. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/pydantic_eval_runner.py +0 -0
  438. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/steps/__init__.py +0 -0
  439. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/steps/custom.py +0 -0
  440. {tactus-0.15.0 → tactus-0.22.0}/tactus/testing/steps/registry.py +0 -0
  441. {tactus-0.15.0 → tactus-0.22.0}/tactus/tracing/__init__.py +0 -0
  442. {tactus-0.15.0 → tactus-0.22.0}/tactus/utils/__init__.py +0 -0
  443. {tactus-0.15.0 → tactus-0.22.0}/tactus/utils/cost_calculator.py +0 -0
  444. {tactus-0.15.0 → tactus-0.22.0}/tactus/utils/model_pricing.py +0 -0
  445. {tactus-0.15.0 → tactus-0.22.0}/tactus/utils/safe_file_library.py +0 -0
  446. {tactus-0.15.0 → tactus-0.22.0}/tactus/utils/safe_libraries.py +0 -0
  447. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/README.md +0 -0
  448. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/__init__.py +0 -0
  449. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/error_listener.py +0 -0
  450. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaLexer.interp +0 -0
  451. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
  452. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaParser.interp +0 -0
  453. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/generated/LuaParser.tokens +0 -0
  454. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  455. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
  456. {tactus-0.15.0 → tactus-0.22.0}/tactus/validation/validator.py +0 -0
  457. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/.gitignore +0 -0
  458. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/README.md +0 -0
  459. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
  460. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  461. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/backend/hook-lupa.py +0 -0
  462. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
  463. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/package-lock.json +0 -0
  464. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/package.json +0 -0
  465. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/preload/preload.ts +0 -0
  466. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/preload/tsconfig.json +0 -0
  467. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/rebuild-and-test.sh +0 -0
  468. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/scripts/build-backend.js +0 -0
  469. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/scripts/build-frontend.js +0 -0
  470. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/src/backend-manager.ts +0 -0
  471. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/src/main.ts +0 -0
  472. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/src/menu.ts +0 -0
  473. {tactus-0.15.0 → tactus-0.22.0}/tactus-desktop/tsconfig.json +0 -0
  474. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/CHANGELOG.md +0 -0
  475. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/DEV_MODE.md +0 -0
  476. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/QUICK_START.md +0 -0
  477. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  478. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
  479. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/README.md +0 -0
  480. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/events.py +0 -0
  481. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/logging_capture.py +0 -0
  482. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/lsp_server.py +0 -0
  483. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/requirements.txt +0 -0
  484. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  485. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/dev.sh +0 -0
  486. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
  487. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  488. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  489. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/index.html +0 -0
  490. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/jest.config.js +0 -0
  491. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/package.json +0 -0
  492. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/postcss.config.js +0 -0
  493. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
  494. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  495. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  496. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  497. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  498. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  499. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  500. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  501. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  502. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  503. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  504. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  505. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  506. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  507. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  508. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  509. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  510. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  511. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  512. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  513. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  514. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  515. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  516. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  517. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  518. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  519. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  520. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  521. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  522. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  523. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  524. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  525. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  526. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  527. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  528. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  529. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  530. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  531. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  532. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  533. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  534. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  535. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  536. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  537. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  538. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  539. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  540. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  541. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  542. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  543. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  544. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  545. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  546. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  547. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  548. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  549. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  550. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  551. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  552. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  553. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  554. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  555. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  556. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  557. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  558. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  559. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  560. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  561. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  562. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  563. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  564. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  565. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/index.css +0 -0
  566. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  567. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/main.tsx +0 -0
  568. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/types/results.ts +0 -0
  569. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  570. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  571. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  572. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  573. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
  574. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  575. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/tailwind.config.js +0 -0
  576. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/tsconfig.json +0 -0
  577. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
  578. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/vite.config.ts +0 -0
  579. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  580. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/package.json +0 -0
  581. {tactus-0.15.0 → tactus-0.22.0}/tactus-ide/start-dev.sh +0 -0
  582. {tactus-0.15.0 → tactus-0.22.0}/tests/__init__.py +0 -0
  583. {tactus-0.15.0 → tactus-0.22.0}/tests/adapters/__init__.py +0 -0
  584. {tactus-0.15.0 → tactus-0.22.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
  585. {tactus-0.15.0 → tactus-0.22.0}/tests/adapters/test_plugins.py +0 -0
  586. {tactus-0.15.0 → tactus-0.22.0}/tests/cli/__init__.py +0 -0
  587. {tactus-0.15.0 → tactus-0.22.0}/tests/conftest.py +0 -0
  588. {tactus-0.15.0 → tactus-0.22.0}/tests/core/__init__.py +0 -0
  589. {tactus-0.15.0 → tactus-0.22.0}/tests/core/test_config_manager.py +0 -0
  590. {tactus-0.15.0 → tactus-0.22.0}/tests/core/test_determinism_safety.py +0 -0
  591. {tactus-0.15.0 → tactus-0.22.0}/tests/fixtures/__init__.py +0 -0
  592. {tactus-0.15.0 → tactus-0.22.0}/tests/fixtures/test_mcp_server.py +0 -0
  593. {tactus-0.15.0 → tactus-0.22.0}/tests/integration/test_named_procedures.py +0 -0
  594. {tactus-0.15.0 → tactus-0.22.0}/tests/mocks/__init__.py +0 -0
  595. {tactus-0.15.0 → tactus-0.22.0}/tests/mocks/llm_mocks.py +0 -0
  596. {tactus-0.15.0 → tactus-0.22.0}/tests/primitives/test_retry_primitive.py +0 -0
  597. {tactus-0.15.0 → tactus-0.22.0}/tests/primitives/test_state_primitive.py +0 -0
  598. {tactus-0.15.0 → tactus-0.22.0}/tests/primitives/test_tool_primitive.py +0 -0
  599. {tactus-0.15.0 → tactus-0.22.0}/tests/primitives/test_toolset_dsl.py +0 -0
  600. {tactus-0.15.0 → tactus-0.22.0/tests}/test_checkpoints_integration.py +0 -0
  601. {tactus-0.15.0 → tactus-0.22.0}/tests/test_tracing.py +0 -0
  602. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/__init__.py +0 -0
  603. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/conftest.py +0 -0
  604. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_integration.py +0 -0
  605. {tactus-0.15.0 → tactus-0.22.0}/tests/testing/test_step_registry.py +0 -0
  606. {tactus-0.15.0 → tactus-0.22.0}/tests/utils/__init__.py +0 -0
  607. {tactus-0.15.0 → tactus-0.22.0}/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
@@ -98,6 +98,17 @@ Agent "bedrock_agent" {
98
98
  - **Do NOT delete or truncate `CHANGELOG.md`**.
99
99
  - Ensure your commit messages follow the [Angular Commit Message Convention](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit) (e.g., `feat: ...`, `fix: ...`, `docs: ...`) so that Semantic Release can correctly generate the changelog.
100
100
 
101
+ ## Commit Message Guidelines
102
+
103
+ When writing commit messages:
104
+
105
+ - **Do NOT use code blocks** (backticks or triple backticks) in commit messages
106
+ - Use plain text with proper formatting (bullet points, indentation)
107
+ - Keep commit subject lines concise (50-72 characters)
108
+ - Use the imperative mood ("fix bug" not "fixed bug")
109
+ - Include detailed explanations in the commit body when necessary
110
+ - Follow the Angular Commit Message Convention for the subject line
111
+
101
112
  ## Parser Generation Requirements
102
113
 
103
114
  **IMPORTANT**: Tactus uses ANTLR4 to generate parsers from the Lua grammar for both Python and TypeScript.
@@ -138,7 +149,7 @@ The IDE uses a two-layer validation approach for optimal performance and user ex
138
149
 
139
150
  **Layer 1: TypeScript Parser (Client-Side)**
140
151
  - Location: `tactus-ide/frontend/src/validation/`
141
- - ANTLR-generated from same `Lua.g4` grammar as Python parser
152
+ - ANTLR-generated from same `LuaLexer.g4` and `LuaParser.g4` grammars as Python parser
142
153
  - Purpose: Instant syntax validation (< 10ms)
143
154
  - Runs in browser, no backend needed
144
155
  - Provides immediate feedback as user types
@@ -2,6 +2,128 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.22.0 (2026-01-10)
6
+
7
+ ### Features
8
+
9
+ - **agent**: Add configurable `module` parameter for DSPy module selection (#21)
10
+ ([#21](https://github.com/AnthusAI/Tactus/pull/21),
11
+ [`0c93af0`](https://github.com/AnthusAI/Tactus/commit/0c93af0575d191be58ed0635ed236e359d8b35af))
12
+
13
+
14
+ ## v0.21.1 (2026-01-10)
15
+
16
+ ### Bug Fixes
17
+
18
+ - **ci**: Add --skip-existing to twine upload
19
+ ([`7a1b369`](https://github.com/AnthusAI/Tactus/commit/7a1b369376ce68869b98f0faed877a52855b4459))
20
+
21
+
22
+ ## v0.21.0 (2026-01-10)
23
+
24
+ ### Bug Fixes
25
+
26
+ - Add Checkpoint.exists and Checkpoint.get
27
+ ([`d652411`](https://github.com/AnthusAI/Tactus/commit/d6524115dea8de42559b94a1f35309f7538958e7))
28
+
29
+ - Add System.alert primitive
30
+ ([`18ece11`](https://github.com/AnthusAI/Tactus/commit/18ece114eea760e97b07a493b7ee13eb27034516))
31
+
32
+ - Clarify summarization prompts are logged
33
+ ([`423b912`](https://github.com/AnthusAI/Tactus/commit/423b912c590cd7e9702a0e9dbb76288f26cdfd4a))
34
+
35
+ - Clarify template namespaces and rendering
36
+ ([`a33a383`](https://github.com/AnthusAI/Tactus/commit/a33a3831fb335b81d1e3152f5feb6d24f436bdb8))
37
+
38
+ - Expose agent Result usage and history
39
+ ([`7f41286`](https://github.com/AnthusAI/Tactus/commit/7f412860f94c79a442fc8e86365f71ddddc9b58f))
40
+
41
+ - Handle string input in agent __call__ method
42
+ ([`4af6ad5`](https://github.com/AnthusAI/Tactus/commit/4af6ad590cacb116885ce60ca93656c092f01435))
43
+
44
+ - Remove incompatible tests and skip deprecated YAML test
45
+ ([`f96f084`](https://github.com/AnthusAI/Tactus/commit/f96f0842ceffa8176329b5553096c39ff1ba15d1))
46
+
47
+ - Standardize on TactusResult.value and fix agent mock lookup
48
+ ([`a4e02c0`](https://github.com/AnthusAI/Tactus/commit/a4e02c0699a40461a2d0476e1359216d02a82616))
49
+
50
+ - Support message alias for agent calls
51
+ ([`9a2b817`](https://github.com/AnthusAI/Tactus/commit/9a2b817478acf5848dad346fa9d0f0dd1a78eb86))
52
+
53
+ - **ci**: Only run twine upload when dist files exist
54
+ ([`d490f55`](https://github.com/AnthusAI/Tactus/commit/d490f5527c8588666ffcafa67d13e195815c2856))
55
+
56
+ ### Chores
57
+
58
+ - Update .gitignore to include tmp/ directory
59
+ ([`1294360`](https://github.com/AnthusAI/Tactus/commit/1294360a261cec1ff8c35f8063ae2b652c340373))
60
+
61
+
62
+ ## v0.20.0 (2026-01-09)
63
+
64
+
65
+ ## v0.19.0 (2026-01-09)
66
+
67
+
68
+ ## v0.18.0 (2026-01-09)
69
+
70
+
71
+ ## v0.17.0 (2026-01-08)
72
+
73
+ ### Bug Fixes
74
+
75
+ - Pass registry and mock_manager to DSPy agent creation
76
+ ([`e86a069`](https://github.com/AnthusAI/Tactus/commit/e86a0690cba607507f4745106f8a609aab38c8f3))
77
+
78
+ - Remove unused Path import in test_script_mode.py
79
+ ([`1c28430`](https://github.com/AnthusAI/Tactus/commit/1c28430502ac2f1c0b08f6456ec7374e9fc4252a))
80
+
81
+ ### Code Style
82
+
83
+ - Format code with black
84
+ ([`2fc1a07`](https://github.com/AnthusAI/Tactus/commit/2fc1a0734f639c3d502f4e96b0eb44703a3522c8))
85
+
86
+ ### Testing
87
+
88
+ - Skip agent mock test in CI until mocking fully implemented
89
+ ([`f46f183`](https://github.com/AnthusAI/Tactus/commit/f46f1834a616a8dfde31b9ee6cdb928264489b93))
90
+
91
+ - Skip DSPy agent mock test - assignment name interception not working
92
+ ([`b7971d3`](https://github.com/AnthusAI/Tactus/commit/b7971d3d87dd07f43c98fcab524a5cad5848db5d))
93
+
94
+
95
+ ## v0.16.0 (2026-01-07)
96
+
97
+ ### Bug Fixes
98
+
99
+ - **tests**: Resolve ruff linting errors
100
+ ([`892f73e`](https://github.com/AnthusAI/Tactus/commit/892f73eed13602cb6cb6328c363b1caa938db850))
101
+
102
+ ### Code Style
103
+
104
+ - Format code with black
105
+ ([`bdec5b8`](https://github.com/AnthusAI/Tactus/commit/bdec5b8836d7d95bd6531ede2c4f000e24e79764))
106
+
107
+ ### Features
108
+
109
+ - **dspy**: Add comprehensive behavior specifications for DSPy integration
110
+ ([`531167e`](https://github.com/AnthusAI/Tactus/commit/531167e2c423c605792f1e5ab3602f7eb05ab6d8))
111
+
112
+ - **dspy**: Add model_type parameter support for reasoning models
113
+ ([`bf8cef3`](https://github.com/AnthusAI/Tactus/commit/bf8cef38e0e0674ccf1ebfac75a92c54e80b6d0c))
114
+
115
+ - **dspy**: Add model_type parameter support for reasoning models
116
+ ([`0043293`](https://github.com/AnthusAI/Tactus/commit/00432937a11adc01a846909fe1ae9520cc927eab))
117
+
118
+ ### Refactoring
119
+
120
+ - **examples**: Simplify agent example and add gpt-5-mini support
121
+ ([`7e7934e`](https://github.com/AnthusAI/Tactus/commit/7e7934eb89508d100dbce5ebd497ddcefda7778d))
122
+
123
+
124
+ ## v0.15.1 (2026-01-07)
125
+
126
+
5
127
  ## v0.15.0 (2026-01-07)
6
128
 
7
129
  ### Code Style
@@ -176,7 +176,7 @@ input {
176
176
  }
177
177
 
178
178
  -- Top-level code acts as main procedure
179
- Worker.turn({inject = input.task})
179
+ Worker({message = input.task})
180
180
  return {result = "done"}
181
181
  ```
182
182
 
@@ -249,7 +249,7 @@ output {
249
249
  }
250
250
 
251
251
  -- Top-level code returns output
252
- Worker.turn()
252
+ Worker()
253
253
  return {result = "done"}
254
254
  ```
255
255
 
@@ -277,87 +277,94 @@ return {result = "done"}
277
277
 
278
278
  ### Script Mode (Phase 6)
279
279
 
280
- **Status**: ✅ **Fully Implemented**
280
+ **Status**: ✅ **Fully Implemented** (Zero-Wrapper with Source Transformation)
281
+
282
+ Script mode allows simple procedures to be written without explicit `Procedure {}` wrappers. Top-level code becomes the entry point, making Tactus feel more like a script than a framework.
281
283
 
282
- Script mode allows simple procedures to be written without explicit `procedure()` wrappers. Top-level code becomes the entry point, making Tactus feel more like a script than a framework.
284
+ #### Zero-Wrapper Syntax
283
285
 
284
- #### Three Approaches
286
+ Write procedures without any wrapper - just top-level `input {}`, `output {}`, and executable code:
285
287
 
286
- **1. Simplest (no schemas):**
288
+ **Basic Example:**
287
289
 
288
290
  ```lua
289
- -- No input/output declarations needed
290
- Worker = agent "worker" {
291
- model = "claude-sonnet-4-20250514",
292
- system_prompt = "You are a helpful assistant."
291
+ -- No Procedure wrapper needed
292
+ input {
293
+ name = field.string{required = true}
293
294
  }
294
295
 
295
- Worker.turn({inject = input.text})
296
- return {result = Worker.output}
296
+ output {
297
+ greeting = field.string{required = true}
298
+ }
299
+
300
+ local message = "Hello, " .. input.name .. "!"
301
+ return {greeting = message}
297
302
  ```
298
303
 
299
- **2. With Schema Declarations:**
304
+ **With Agents:**
300
305
 
301
306
  ```lua
302
307
  input {
303
- text = {type = "string", required = true},
304
- language = {type = "string", default = "en"}
308
+ task = field.string{required = true}
305
309
  }
306
310
 
307
311
  output {
308
- result = {type = "string", required = true}
312
+ result = field.string{required = true}
309
313
  }
310
314
 
311
- Worker = agent "worker" {
312
- model = "claude-sonnet-4-20250514"
315
+ done = tactus.done
316
+
317
+ worker = Agent {
318
+ provider = "openai",
319
+ model = "gpt-4o",
320
+ system_prompt = "Complete tasks efficiently",
321
+ tools = {done}
313
322
  }
314
323
 
315
- Worker.turn({inject = input.text})
316
- return {result = Worker.output}
324
+ worker({message = input.task})
325
+
326
+ if done.called() then
327
+ return {result = "Success: " .. done.last_call().args.reason}
328
+ else
329
+ return {result = "Agent did not complete"}
330
+ end
317
331
  ```
318
332
 
319
- **3. Hybrid (sub-procedures + top-level main):**
333
+ **With State:**
320
334
 
321
335
  ```lua
322
- input {document = {type = "string"}}
323
- output {result = {type = "string"}}
324
-
325
- -- Helper sub-procedure
326
- summarize_chunk = procedure "summarize_chunk" {
327
- input = {chunk = {type = "string"}},
328
- output = {summary = {type = "string"}},
329
- run = function()
330
- Summarizer = agent "summarizer" {
331
- model = "claude-sonnet-4-20250514"
332
- }
333
- Summarizer.turn({inject = input.chunk})
334
- return {summary = Summarizer.output}
335
- end
336
+ input {
337
+ value = field.number{required = true}
336
338
  }
337
339
 
338
- -- Top-level code acts as main procedure
339
- chunks = split_text(input.document, 1000)
340
- state.summaries = {}
340
+ output {
341
+ doubled = field.number{required = true}
342
+ }
341
343
 
342
- for i, chunk in ipairs(chunks) do
343
- result = summarize_chunk({chunk = chunk})
344
- state.summaries[i] = result.summary
345
- end
344
+ state.original = input.value
345
+ state.result = state.original * 2
346
346
 
347
- return {result = join_summaries(state.summaries)}
347
+ return {doubled = state.result}
348
348
  ```
349
349
 
350
350
  #### How It Works
351
351
 
352
- 1. Runtime detects top-level `input {}` and `output {}` declarations
353
- 2. If no explicit `main` procedure exists, top-level code is wrapped in implicit main
354
- 3. Top-level code can:
355
- - Access `input` table (from runtime context)
356
- - Define agents and models
357
- - Call sub-procedures
358
- - Mutate `state` table
359
- - Return output table
360
- 4. All durability features work identically (checkpointing, replay, HITL)
352
+ **Source Transformation Approach:**
353
+
354
+ 1. **Detection**: Runtime detects script mode when file has top-level `input {}` or `output {}` without explicit `Procedure {}`
355
+ 2. **Splitting**: Source is split into:
356
+ - **Declarations**: `input {}`, `output {}`, `Mocks {}`, Agent/Tool/Model definitions, comments
357
+ - **Executable code**: Local variables, agent calls, state assignments, control flow, returns
358
+ 3. **Transformation**: Executable code is wrapped in implicit `Procedure { function(input) ... end }`
359
+ 4. **Schema merging**: Top-level schemas are merged into the implicit main procedure
360
+ 5. **Normal execution**: The transformed code executes through standard procedure flow
361
+
362
+ **Why transformation?** During parsing, Lua code executes but agents aren't connected to LLMs yet. The `Procedure { function() ... end }` pattern stores the function during parsing and calls it later. Script mode uses source transformation to wrap executable code before parsing, preventing premature execution.
363
+
364
+ **Pattern Detection:**
365
+ - **Declarations**: Tracked via brace depth - entire multi-line blocks (Agent {}, Mocks {}) stay together
366
+ - **Executable code**: Everything else that doesn't match declaration patterns
367
+ - **Special handling**: Comments, empty lines, and `tactus.*` references treated as declarations
361
368
 
362
369
  #### When to Use
363
370
 
@@ -387,7 +394,7 @@ Script mode files can be gradually converted to explicit procedures without brea
387
394
  ```lua
388
395
  -- Before (script mode)
389
396
  input {text = {type = "string"}}
390
- Worker.turn({inject = input.text})
397
+ Worker({message = input.text})
391
398
  return {result = Worker.output}
392
399
 
393
400
  -- After (explicit procedure)
@@ -396,7 +403,7 @@ main = procedure "main" {
396
403
  output = {result = {type = "string"}},
397
404
  run = function()
398
405
  Worker = agent "worker" {...}
399
- Worker.turn({inject = input.text})
406
+ Worker({message = input.text})
400
407
  return {result = Worker.output}
401
408
  end
402
409
  }
@@ -500,7 +507,7 @@ main = procedure("main", {
500
507
  output = {...}
501
508
  }, function()
502
509
  -- Dependencies available to agents via AgentDeps
503
- Worker.turn()
510
+ Worker()
504
511
  return {...}
505
512
  end)
506
513
  ```
@@ -647,7 +654,7 @@ main = procedure("main", {
647
654
  tools = {weather_lookup_tool} -- Tool uses weather_api from deps
648
655
  })
649
656
 
650
- Worker.turn({inject = "Get weather for " .. input.location})
657
+ Worker({message = "Get weather for " .. input.location})
651
658
  return {
652
659
  temperature = state.temp,
653
660
  condition = state.condition
@@ -734,9 +741,9 @@ Defines interface for HITL implementations.
734
741
 
735
742
  **Specification**: Programmatic alerts from anywhere (not just procedures).
736
743
 
737
- **Status**: **Not Implemented**
744
+ **Status**: **Implemented**
738
745
 
739
- 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.
740
747
 
741
748
  #### Message Classification
742
749
 
@@ -781,7 +788,7 @@ Inline procedures are not parsed by `ProcedureYAMLParser` and cannot be invoked.
781
788
  - ❌ `filter` - Not implemented (no ComposedFilter, TokenBudget, etc.)
782
789
  - ❌ `response.retries` / `response.retry_delay` - Not implemented
783
790
 
784
- **Usage in Lua**: `Worker.turn()` (capitalized agent name)
791
+ **Usage in Lua**: `Worker()` (capitalized agent name, callable syntax)
785
792
 
786
793
  ### Model Primitive (Phase 3: ML Inference)
787
794
 
@@ -864,9 +871,9 @@ state.intent = IntentClassifier.predict(input.message)
864
871
 
865
872
  -- Use result
866
873
  if state.intent == "billing" then
867
- BillingAgent.turn()
874
+ BillingAgent()
868
875
  elseif state.intent == "technical" then
869
- TechAgent.turn()
876
+ TechAgent()
870
877
  end
871
878
  ```
872
879
 
@@ -928,7 +935,7 @@ summarize_chunk = procedure "summarize_chunk" {
928
935
  Summarizer = agent "summarizer" {
929
936
  model = "claude-sonnet-4-20250514"
930
937
  }
931
- Summarizer.turn({inject = input.chunk})
938
+ Summarizer({message = input.chunk})
932
939
  return {summary = Summarizer.output}
933
940
  end
934
941
  }
@@ -1051,7 +1058,7 @@ All procedure invocation primitives are missing.
1051
1058
  state.clusters = cluster_embeddings(state.embeddings)
1052
1059
  checkpoint() -- Save before proceeding
1053
1060
 
1054
- Worker.turn({inject = state.clusters})
1061
+ Worker({message = state.clusters})
1055
1062
  ```
1056
1063
 
1057
1064
  2. **Before risky operations:**
@@ -1096,6 +1103,9 @@ Explicit checkpoints do **not** create suspend points. They simply persist curre
1096
1103
 
1097
1104
  - ✅ `Checkpoint.clear_all()` - Clear all checkpoints (execution log)
1098
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)
1099
1109
 
1100
1110
  **Usage**: Testing and debugging checkpoint replay behavior. These are utility functions for test scenarios, not for production use.
1101
1111
 
@@ -1107,10 +1117,10 @@ Explicit checkpoints do **not** create suspend points. They simply persist curre
1107
1117
 
1108
1118
  **Status**: ✅ **Fully Implemented**
1109
1119
 
1110
- - ✅ `AgentName.turn()` - Execute agent turn
1111
- - ✅ `AgentName.turn({inject = "..."})` - Turn with injected message
1112
- - ✅ `AgentName.turn({tools = {...}})` - Turn with specific tools
1113
- - ✅ `AgentName.turn({tools = {}})` - Turn with no tools
1120
+ - ✅ `AgentName()` - Execute agent turn
1121
+ - ✅ `AgentName({message = "..."})` - Call with a message
1122
+ - ✅ `AgentName({tools = {...}})` - Call with specific tools
1123
+ - ✅ `AgentName({tools = {}})` - Call with no tools
1114
1124
  - ✅ Per-turn model parameter overrides (temperature, max_tokens, top_p, etc.)
1115
1125
 
1116
1126
  **Per-Turn Overrides:**
@@ -1123,15 +1133,15 @@ The `turn()` method now accepts an optional table to override behavior for a sin
1123
1133
  **Common pattern - Tool result summarization:**
1124
1134
  ```lua
1125
1135
  repeat
1126
- Researcher.turn() -- Agent has all tools
1127
-
1128
- if Tool.called("search") then
1129
- Researcher.turn({
1130
- inject = "Summarize the search results",
1136
+ Researcher() -- Agent has all tools
1137
+
1138
+ if search.called() then
1139
+ Researcher({
1140
+ message = "Summarize the search results",
1131
1141
  tools = {} -- No tools for summarization
1132
1142
  })
1133
1143
  end
1134
- until Tool.called("done")
1144
+ until done.called()
1135
1145
  ```
1136
1146
 
1137
1147
  **Response Access:**
@@ -1174,35 +1184,30 @@ main = procedure("main", {
1174
1184
  end)
1175
1185
  ```
1176
1186
 
1177
- #### ResultPrimitive (`tactus/primitives/result.py`)
1178
-
1179
- **Status**: ✅ **Fully Implemented**
1187
+ #### Result (`tactus/protocols/result.py`)
1180
1188
 
1181
- Wraps pydantic-ai's `RunResult` for Lua access.
1189
+ **Status**: **Implemented (DSPy)**
1182
1190
 
1183
- **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).
1184
1192
 
1185
1193
  **Features:**
1186
- - ✅ `result.data` - Response data (text or structured dict)
1194
+ - ✅ `result.value` - Response value (string or structured data)
1187
1195
  - ✅ `result.usage` - Token usage stats (prompt_tokens, completion_tokens, total_tokens)
1188
- - ✅ `result.new_messages()` - Messages from this turn
1189
- - ✅ `result.all_messages()` - Full conversation history
1190
- - ✅ `result.cost()` - Token usage (for cost calculation)
1196
+ - ✅ `result.cost()` - Cost stats (total_cost, prompt_cost, completion_cost)
1191
1197
 
1192
- **Breaking change:** `Agent.turn()` now returns `ResultPrimitive` instead of raw data. Access response via `result.data`.
1198
+ **Breaking change:** Access agent output via `result.value` (not `result.message` / `result.data`).
1199
+
1200
+ **Implementation locations:**
1201
+ - `tactus/dspy/agent.py` (`DSPyAgentHandle.__call__`)
1202
+ - `tactus/protocols/result.py` (`TactusResult`)
1203
+ - `tactus/protocols/cost.py` (`UsageStats`, `CostStats`)
1193
1204
 
1194
1205
  **Example:**
1195
1206
  ```lua
1196
- local result = Agent.turn()
1197
-
1198
- -- Access response
1199
- Log.info(result.data)
1200
-
1201
- -- Access usage
1207
+ local result = Agent()
1208
+ Log.info(result.value)
1202
1209
  Log.info("Tokens", {total = result.usage.total_tokens})
1203
-
1204
- -- Access messages
1205
- local msgs = result.new_messages()
1210
+ Log.info("Cost", {total = result.cost().total_cost})
1206
1211
  ```
1207
1212
 
1208
1213
  #### Structured Output (output_type)
@@ -1226,8 +1231,8 @@ agent("extractor", {
1226
1231
  })
1227
1232
 
1228
1233
  -- Agent automatically validates output against schema
1229
- local result = Extractor.turn()
1230
- Log.info(result.data.city) -- Type-safe access
1234
+ local result = Extractor()
1235
+ Log.info(result.value.city)
1231
1236
  ```
1232
1237
 
1233
1238
  #### State Primitives
@@ -1309,7 +1314,7 @@ procedure "order_fulfillment" {
1309
1314
  - ✅ `Iterations.exceeded(max)` - Check if exceeded limit
1310
1315
 
1311
1316
  **Implementation:**
1312
- - Incremented by `AgentPrimitive.turn()` automatically
1317
+ - Incremented by agent calls automatically
1313
1318
  - Can be checked in procedure code for safety limits
1314
1319
 
1315
1320
  #### StopPrimitive (`tactus/primitives/control.py`)
@@ -1486,7 +1491,7 @@ No graph/tree structure primitives. Procedures are linear sequences, not graphs.
1486
1491
 
1487
1492
  | Type | Description | Created By |
1488
1493
  |------|-------------|------------|
1489
- | `agent_turn` | LLM conversation turn | `AgentPrimitive.turn()` |
1494
+ | `agent_turn` | LLM conversation turn | `Agent()` (callable syntax) |
1490
1495
  | `model_predict` | ML inference | `ModelPrimitive.predict()` |
1491
1496
  | `procedure_call` | Sub-procedure invocation | Procedure callable |
1492
1497
  | `hitl_approval` | Human approval request | `Human.approve()` |
@@ -1542,9 +1547,9 @@ checkpoint()
1542
1547
 
1543
1548
  -- ❌ Unsafe: Random value used across checkpoints
1544
1549
  local x = math.random(100) -- WARNING!
1545
- Worker.turn() -- Checkpoint
1550
+ Worker() -- Checkpoint
1546
1551
  if x > 50 then -- Diverges on replay
1547
- Publisher.turn()
1552
+ Publisher()
1548
1553
  end
1549
1554
  ```
1550
1555
 
@@ -1749,9 +1754,9 @@ tactus evaluate procedure.tac --runs 10
1749
1754
  - Only local context exists
1750
1755
  - No AWS Lambda integration
1751
1756
 
1752
- 4. **System.alert()**
1753
- - No system-level alerts
1754
- - 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)
1755
1760
 
1756
1761
  5. **Async Procedure Spawning** ❌
1757
1762
  - No `Procedure.spawn()` for async invocation
@@ -1818,7 +1823,6 @@ tactus/
1818
1823
  │ ├── retry.py # RetryPrimitive
1819
1824
  │ ├── file.py # FilePrimitive
1820
1825
  │ ├── message_history.py # MessageHistoryPrimitive
1821
- │ ├── result.py # ResultPrimitive
1822
1826
  │ └── deps_generator.py # Dynamic AgentDeps generation [NEW]
1823
1827
 
1824
1828
  ├── backends/
@@ -1895,7 +1899,7 @@ To align the implementation with the specification:
1895
1899
  ### Medium Priority
1896
1900
  4. **Inline Procedures** - Parse and support `procedures:` section in YAML
1897
1901
  5. **Agent `prepare` hook** - Enable `prepared` template namespace
1898
- 6. **System.alert()** - System-level alert infrastructure
1902
+ 6. **System.alert() integrations** - Route alerts to external monitoring
1899
1903
  7. **Template variables** - Add `context`, `env`, `output` support
1900
1904
  8. **More Model Backends** - BERT, scikit-learn, ONNX, SageMaker
1901
1905