tactus 0.28.0__tar.gz → 0.29.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 (592) hide show
  1. tactus-0.29.1/.github/workflows/release.yml +177 -0
  2. {tactus-0.28.0 → tactus-0.29.1}/AGENTS.md +57 -0
  3. {tactus-0.28.0 → tactus-0.29.1}/CHANGELOG.md +21 -0
  4. {tactus-0.28.0 → tactus-0.29.1}/PKG-INFO +1 -1
  5. tactus-0.29.1/docs/development-mode.md +128 -0
  6. {tactus-0.28.0 → tactus-0.29.1}/pyproject.toml +1 -1
  7. {tactus-0.28.0 → tactus-0.29.1}/tactus/__init__.py +1 -1
  8. {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/server.py +2 -1
  9. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/config.py +6 -0
  10. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/container_runner.py +49 -0
  11. tactus-0.29.1/tactus-desktop/BUILD_GUIDE.md +213 -0
  12. tactus-0.29.1/tactus-desktop/ELECTRON_INTEGRATION.md +206 -0
  13. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/backend/tactus_backend.spec +6 -0
  14. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/package.json +1 -0
  15. tactus-0.29.1/tactus-desktop/resources/app-icon.icns +0 -0
  16. tactus-0.29.1/tactus-desktop/resources/app-icon.ico +0 -0
  17. tactus-0.29.1/tactus-desktop/resources/app-icon.png +0 -0
  18. tactus-0.29.1/tactus-desktop/scripts/generate-icons.sh +95 -0
  19. tactus-0.29.1/tactus-ide/frontend/src/components/ui/logo.tsx +22 -0
  20. tactus-0.28.0/.github/workflows/desktop-release.yml +0 -83
  21. tactus-0.28.0/.github/workflows/release.yml +0 -92
  22. tactus-0.28.0/tactus-ide/frontend/src/components/ui/logo.tsx +0 -579
  23. {tactus-0.28.0 → tactus-0.29.1}/.claude/agents.md +0 -0
  24. {tactus-0.28.0 → tactus-0.29.1}/.gitignore +0 -0
  25. {tactus-0.28.0 → tactus-0.29.1}/.tactus/config.yml.example +0 -0
  26. {tactus-0.28.0 → tactus-0.29.1}/IMPLEMENTATION.md +0 -0
  27. {tactus-0.28.0 → tactus-0.29.1}/LICENSE +0 -0
  28. {tactus-0.28.0 → tactus-0.29.1}/Makefile +0 -0
  29. {tactus-0.28.0 → tactus-0.29.1}/README.md +0 -0
  30. {tactus-0.28.0 → tactus-0.29.1}/SPECIFICATION.md +0 -0
  31. {tactus-0.28.0 → tactus-0.29.1}/TECHNICAL_DEBT.md +0 -0
  32. {tactus-0.28.0 → tactus-0.29.1}/behave.ini +0 -0
  33. {tactus-0.28.0 → tactus-0.29.1}/docs/AGENTS.md +0 -0
  34. {tactus-0.28.0 → tactus-0.29.1}/docs/BDD_TESTING.md +0 -0
  35. {tactus-0.28.0 → tactus-0.29.1}/docs/CONFIGURATION.md +0 -0
  36. {tactus-0.28.0 → tactus-0.29.1}/docs/DURABILITY.md +0 -0
  37. {tactus-0.28.0 → tactus-0.29.1}/docs/FILE_IO.md +0 -0
  38. {tactus-0.28.0 → tactus-0.29.1}/docs/SANDBOXING.md +0 -0
  39. {tactus-0.28.0 → tactus-0.29.1}/docs/STREAMING.md +0 -0
  40. {tactus-0.28.0 → tactus-0.29.1}/docs/TOOLS.md +0 -0
  41. {tactus-0.28.0 → tactus-0.29.1}/docs/TOOL_ROADMAP.md +0 -0
  42. {tactus-0.28.0 → tactus-0.29.1}/examples/.tactus/config.yml +0 -0
  43. {tactus-0.28.0 → tactus-0.29.1}/examples/01-basics-hello-world.tac +0 -0
  44. {tactus-0.28.0 → tactus-0.29.1}/examples/02-basics-simple-logic.tac +0 -0
  45. {tactus-0.28.0 → tactus-0.29.1}/examples/03-basics-parameters.tac +0 -0
  46. {tactus-0.28.0 → tactus-0.29.1}/examples/04-basics-simple-agent.tac +0 -0
  47. {tactus-0.28.0 → tactus-0.29.1}/examples/05-basics-multi-model.tac +0 -0
  48. {tactus-0.28.0 → tactus-0.29.1}/examples/06-basics-streaming.tac +0 -0
  49. {tactus-0.28.0 → tactus-0.29.1}/examples/07-basics-bedrock.tac +0 -0
  50. {tactus-0.28.0 → tactus-0.29.1}/examples/08-basics-models.tac +0 -0
  51. {tactus-0.28.0 → tactus-0.29.1}/examples/09-basics-google-gemini.tac +0 -0
  52. {tactus-0.28.0 → tactus-0.29.1}/examples/10-feature-state.tac +0 -0
  53. {tactus-0.28.0 → tactus-0.29.1}/examples/11-feature-message-history.tac +0 -0
  54. {tactus-0.28.0 → tactus-0.29.1}/examples/12-feature-structured-output.tac +0 -0
  55. {tactus-0.28.0 → tactus-0.29.1}/examples/13-feature-session.tac +0 -0
  56. {tactus-0.28.0 → tactus-0.29.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
  57. {tactus-0.28.0 → tactus-0.29.1}/examples/14-feature-per-turn-tools.tac +0 -0
  58. {tactus-0.28.0 → tactus-0.29.1}/examples/15-feature-local-tools.tac +0 -0
  59. {tactus-0.28.0 → tactus-0.29.1}/examples/16-feature-toolsets-advanced.tac +0 -0
  60. {tactus-0.28.0 → tactus-0.29.1}/examples/17-feature-toolsets-dsl.tac +0 -0
  61. {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-individual.tac +0 -0
  62. {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-inline.tac +0 -0
  63. {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-toolset.tac +0 -0
  64. {tactus-0.28.0 → tactus-0.29.1}/examples/19-feature-direct-tool-calls.tac +0 -0
  65. {tactus-0.28.0 → tactus-0.29.1}/examples/20-bdd-complete.tac +0 -0
  66. {tactus-0.28.0 → tactus-0.29.1}/examples/20-bdd-complete.tac.bak2 +0 -0
  67. {tactus-0.28.0 → tactus-0.29.1}/examples/21-bdd-passing.tac +0 -0
  68. {tactus-0.28.0 → tactus-0.29.1}/examples/21-bdd-passing.tac.bak2 +0 -0
  69. {tactus-0.28.0 → tactus-0.29.1}/examples/30-eval-simple.tac +0 -0
  70. {tactus-0.28.0 → tactus-0.29.1}/examples/31-eval-demo.tac +0 -0
  71. {tactus-0.28.0 → tactus-0.29.1}/examples/32-eval-success-rate.tac +0 -0
  72. {tactus-0.28.0 → tactus-0.29.1}/examples/33-eval-thresholds.tac +0 -0
  73. {tactus-0.28.0 → tactus-0.29.1}/examples/34-eval-dataset.jsonl +0 -0
  74. {tactus-0.28.0 → tactus-0.29.1}/examples/34-eval-dataset.tac +0 -0
  75. {tactus-0.28.0 → tactus-0.29.1}/examples/35-eval-trace.tac +0 -0
  76. {tactus-0.28.0 → tactus-0.29.1}/examples/35-eval-trace.tac.bak2 +0 -0
  77. {tactus-0.28.0 → tactus-0.29.1}/examples/36-eval-advanced.tac +0 -0
  78. {tactus-0.28.0 → tactus-0.29.1}/examples/37-eval-comprehensive.tac +0 -0
  79. {tactus-0.28.0 → tactus-0.29.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
  80. {tactus-0.28.0 → tactus-0.29.1}/examples/39-model-simple.tac +0 -0
  81. {tactus-0.28.0 → tactus-0.29.1}/examples/40-mcp-test.tac +0 -0
  82. {tactus-0.28.0 → tactus-0.29.1}/examples/40-model-text-classifier.tac +0 -0
  83. {tactus-0.28.0 → tactus-0.29.1}/examples/41-mcp-simple.tac +0 -0
  84. {tactus-0.28.0 → tactus-0.29.1}/examples/41-model-pytorch.tac +0 -0
  85. {tactus-0.28.0 → tactus-0.29.1}/examples/43-sub-procedure-simple.tac +0 -0
  86. {tactus-0.28.0 → tactus-0.29.1}/examples/44-sub-procedure-composition.tac +0 -0
  87. {tactus-0.28.0 → tactus-0.29.1}/examples/45-sub-procedure-recursive.tac +0 -0
  88. {tactus-0.28.0 → tactus-0.29.1}/examples/46-checkpoint-explicit.tac +0 -0
  89. {tactus-0.28.0 → tactus-0.29.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
  90. {tactus-0.28.0 → tactus-0.29.1}/examples/48-script-mode-simple.tac +0 -0
  91. {tactus-0.28.0 → tactus-0.29.1}/examples/50-inputs-showcase.tac +0 -0
  92. {tactus-0.28.0 → tactus-0.29.1}/examples/51-inputs-calculator.tac +0 -0
  93. {tactus-0.28.0 → tactus-0.29.1}/examples/52-file-io-basics.tac +0 -0
  94. {tactus-0.28.0 → tactus-0.29.1}/examples/53-tsv-file-io.tac +0 -0
  95. {tactus-0.28.0 → tactus-0.29.1}/examples/54-json-file-io.tac +0 -0
  96. {tactus-0.28.0 → tactus-0.29.1}/examples/55-parquet-file-io.tac +0 -0
  97. {tactus-0.28.0 → tactus-0.29.1}/examples/56-hdf5-file-io.tac +0 -0
  98. {tactus-0.28.0 → tactus-0.29.1}/examples/57-excel-file-io.tac +0 -0
  99. {tactus-0.28.0 → tactus-0.29.1}/examples/58-text-file-io.tac +0 -0
  100. {tactus-0.28.0 → tactus-0.29.1}/examples/60-tool-sources.tac +0 -0
  101. {tactus-0.28.0 → tactus-0.29.1}/examples/61-inline-toolset-lua.tac +0 -0
  102. {tactus-0.28.0 → tactus-0.29.1}/examples/62-mcp-toolset-by-server.tac +0 -0
  103. {tactus-0.28.0 → tactus-0.29.1}/examples/63-toolset-import-from-file.tac +0 -0
  104. {tactus-0.28.0 → tactus-0.29.1}/examples/64-require-modules.tac +0 -0
  105. {tactus-0.28.0 → tactus-0.29.1}/examples/65-optional-state-demo.tac +0 -0
  106. {tactus-0.28.0 → tactus-0.29.1}/examples/66-host-tools-via-broker.tac +0 -0
  107. {tactus-0.28.0 → tactus-0.29.1}/examples/67-host-tool-source.tac +0 -0
  108. {tactus-0.28.0 → tactus-0.29.1}/examples/70-mocking-static.tac +0 -0
  109. {tactus-0.28.0 → tactus-0.29.1}/examples/71-mocking-temporal.tac +0 -0
  110. {tactus-0.28.0 → tactus-0.29.1}/examples/72-mocking-conditional.tac +0 -0
  111. {tactus-0.28.0 → tactus-0.29.1}/examples/99-misc-test-loading.tac +0 -0
  112. {tactus-0.28.0 → tactus-0.29.1}/examples/README.md +0 -0
  113. {tactus-0.28.0 → tactus-0.29.1}/examples/app_config.ini +0 -0
  114. {tactus-0.28.0 → tactus-0.29.1}/examples/data/sample.csv +0 -0
  115. {tactus-0.28.0 → tactus-0.29.1}/examples/demo_output.json +0 -0
  116. {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/math_module.tac +0 -0
  117. {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/product.tac +0 -0
  118. {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/string_module.tac +0 -0
  119. {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/sum.tac +0 -0
  120. {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/text_tools.tac +0 -0
  121. {tactus-0.28.0 → tactus-0.29.1}/examples/inventory_summary.tsv +0 -0
  122. {tactus-0.28.0 → tactus-0.29.1}/examples/mock-config.json +0 -0
  123. {tactus-0.28.0 → tactus-0.29.1}/examples/models/README.md +0 -0
  124. {tactus-0.28.0 → tactus-0.29.1}/examples/models/create_sentiment_model.py +0 -0
  125. {tactus-0.28.0 → tactus-0.29.1}/examples/output_summary.txt +0 -0
  126. {tactus-0.28.0 → tactus-0.29.1}/examples/test-raw-module.tac +0 -0
  127. {tactus-0.28.0 → tactus-0.29.1}/examples/test-raw-streaming.tac +0 -0
  128. {tactus-0.28.0 → tactus-0.29.1}/examples/tools/calculations.py +0 -0
  129. {tactus-0.28.0 → tactus-0.29.1}/examples/tools/data_analysis.py +0 -0
  130. {tactus-0.28.0 → tactus-0.29.1}/examples/tools/search.py +0 -0
  131. {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/README.md +0 -0
  132. {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/simple_http_test.tac +0 -0
  133. {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/time_lookup.tac +0 -0
  134. {tactus-0.28.0 → tactus-0.29.1}/features/01_state_management.feature +0 -0
  135. {tactus-0.28.0 → tactus-0.29.1}/features/02_checkpointing.feature +0 -0
  136. {tactus-0.28.0 → tactus-0.29.1}/features/03_human_in_the_loop.feature +0 -0
  137. {tactus-0.28.0 → tactus-0.29.1}/features/04_control_flow.feature +0 -0
  138. {tactus-0.28.0 → tactus-0.29.1}/features/05_tool_integration.feature +0 -0
  139. {tactus-0.28.0 → tactus-0.29.1}/features/06_retry_logic.feature +0 -0
  140. {tactus-0.28.0 → tactus-0.29.1}/features/07_file_operations.feature +0 -0
  141. {tactus-0.28.0 → tactus-0.29.1}/features/08_agent_primitives.feature +0 -0
  142. {tactus-0.28.0 → tactus-0.29.1}/features/09_workflow_execution.feature +0 -0
  143. {tactus-0.28.0 → tactus-0.29.1}/features/10_lua_integration.feature +0 -0
  144. {tactus-0.28.0 → tactus-0.29.1}/features/11_storage_backends.feature +0 -0
  145. {tactus-0.28.0 → tactus-0.29.1}/features/12_json_operations.feature +0 -0
  146. {tactus-0.28.0 → tactus-0.29.1}/features/13_logging.feature +0 -0
  147. {tactus-0.28.0 → tactus-0.29.1}/features/14_stage_and_step_tracking.feature +0 -0
  148. {tactus-0.28.0 → tactus-0.29.1}/features/15_procedure_calls.feature +0 -0
  149. {tactus-0.28.0 → tactus-0.29.1}/features/16_session_management.feature +0 -0
  150. {tactus-0.28.0 → tactus-0.29.1}/features/17_lua_dsl_validation.feature +0 -0
  151. {tactus-0.28.0 → tactus-0.29.1}/features/18_example_procedures.feature +0 -0
  152. {tactus-0.28.0 → tactus-0.29.1}/features/19_ide_server.feature +0 -0
  153. {tactus-0.28.0 → tactus-0.29.1}/features/20_parameters.feature +0 -0
  154. {tactus-0.28.0 → tactus-0.29.1}/features/21_outputs.feature +0 -0
  155. {tactus-0.28.0 → tactus-0.29.1}/features/23_prompts.feature +0 -0
  156. {tactus-0.28.0 → tactus-0.29.1}/features/24_bdd_specifications.feature +0 -0
  157. {tactus-0.28.0 → tactus-0.29.1}/features/25_bdd_custom_steps.feature +0 -0
  158. {tactus-0.28.0 → tactus-0.29.1}/features/26_bdd_evaluation.feature +0 -0
  159. {tactus-0.28.0 → tactus-0.29.1}/features/27_default_settings.feature +0 -0
  160. {tactus-0.28.0 → tactus-0.29.1}/features/28_custom_prompts.feature +0 -0
  161. {tactus-0.28.0 → tactus-0.29.1}/features/29_execution_settings.feature +0 -0
  162. {tactus-0.28.0 → tactus-0.29.1}/features/30_session_filters.feature +0 -0
  163. {tactus-0.28.0 → tactus-0.29.1}/features/31_matchers.feature +0 -0
  164. {tactus-0.28.0 → tactus-0.29.1}/features/32_result_object.feature +0 -0
  165. {tactus-0.28.0 → tactus-0.29.1}/features/33_output_type.feature +0 -0
  166. {tactus-0.28.0 → tactus-0.29.1}/features/42_model_primitive.feature +0 -0
  167. {tactus-0.28.0 → tactus-0.29.1}/features/43_sub_procedure_checkpointing.feature +0 -0
  168. {tactus-0.28.0 → tactus-0.29.1}/features/46_explicit_checkpoint.feature +0 -0
  169. {tactus-0.28.0 → tactus-0.29.1}/features/48_script_mode.feature +0 -0
  170. {tactus-0.28.0 → tactus-0.29.1}/features/51_dspy_lm_config.feature +0 -0
  171. {tactus-0.28.0 → tactus-0.29.1}/features/52_dspy_signature.feature +0 -0
  172. {tactus-0.28.0 → tactus-0.29.1}/features/53_dspy_module.feature +0 -0
  173. {tactus-0.28.0 → tactus-0.29.1}/features/54_dspy_history.feature +0 -0
  174. {tactus-0.28.0 → tactus-0.29.1}/features/55_dspy_prediction.feature +0 -0
  175. {tactus-0.28.0 → tactus-0.29.1}/features/56_dspy_agent.feature +0 -0
  176. {tactus-0.28.0 → tactus-0.29.1}/features/57_chat_assistant.feature +0 -0
  177. {tactus-0.28.0 → tactus-0.29.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  178. {tactus-0.28.0 → tactus-0.29.1}/features/documentation/Lua DSL/README.md +0 -0
  179. {tactus-0.28.0 → tactus-0.29.1}/features/environment.py +0 -0
  180. {tactus-0.28.0 → tactus-0.29.1}/features/steps/agent_primitives_steps.py +0 -0
  181. {tactus-0.28.0 → tactus-0.29.1}/features/steps/chat_assistant_steps.py +0 -0
  182. {tactus-0.28.0 → tactus-0.29.1}/features/steps/checkpointing_steps.py +0 -0
  183. {tactus-0.28.0 → tactus-0.29.1}/features/steps/control_flow_steps.py +0 -0
  184. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_agent_steps.py +0 -0
  185. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_history_steps.py +0 -0
  186. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_lm_steps.py +0 -0
  187. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_module_steps.py +0 -0
  188. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_prediction_steps.py +0 -0
  189. {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_signature_steps.py +0 -0
  190. {tactus-0.28.0 → tactus-0.29.1}/features/steps/example_procedures_steps.py +0 -0
  191. {tactus-0.28.0 → tactus-0.29.1}/features/steps/file_operations_steps.py +0 -0
  192. {tactus-0.28.0 → tactus-0.29.1}/features/steps/human_in_the_loop_steps.py +0 -0
  193. {tactus-0.28.0 → tactus-0.29.1}/features/steps/ide_server_steps.py +0 -0
  194. {tactus-0.28.0 → tactus-0.29.1}/features/steps/json_operations_steps.py +0 -0
  195. {tactus-0.28.0 → tactus-0.29.1}/features/steps/logging_steps.py +0 -0
  196. {tactus-0.28.0 → tactus-0.29.1}/features/steps/lua_dsl_validation_steps.py +0 -0
  197. {tactus-0.28.0 → tactus-0.29.1}/features/steps/lua_integration_steps.py +0 -0
  198. {tactus-0.28.0 → tactus-0.29.1}/features/steps/mocking_steps.py +0 -0
  199. {tactus-0.28.0 → tactus-0.29.1}/features/steps/procedure_calls_steps.py +0 -0
  200. {tactus-0.28.0 → tactus-0.29.1}/features/steps/result_and_output_steps.py +0 -0
  201. {tactus-0.28.0 → tactus-0.29.1}/features/steps/retry_logic_steps.py +0 -0
  202. {tactus-0.28.0 → tactus-0.29.1}/features/steps/session_management_steps.py +0 -0
  203. {tactus-0.28.0 → tactus-0.29.1}/features/steps/stage_tracking_steps.py +0 -0
  204. {tactus-0.28.0 → tactus-0.29.1}/features/steps/state_management_steps.py +0 -0
  205. {tactus-0.28.0 → tactus-0.29.1}/features/steps/storage_backend_steps.py +0 -0
  206. {tactus-0.28.0 → tactus-0.29.1}/features/steps/support/__init__.py +0 -0
  207. {tactus-0.28.0 → tactus-0.29.1}/features/steps/support/harnesses.py +0 -0
  208. {tactus-0.28.0 → tactus-0.29.1}/features/steps/tool_integration_steps.py +0 -0
  209. {tactus-0.28.0 → tactus-0.29.1}/features/steps/workflow_execution_steps.py +0 -0
  210. {tactus-0.28.0 → tactus-0.29.1}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
  211. {tactus-0.28.0 → tactus-0.29.1}/scripts/audit_examples_mocking.py +0 -0
  212. {tactus-0.28.0 → tactus-0.29.1}/scripts/convert_examples.py +0 -0
  213. {tactus-0.28.0 → tactus-0.29.1}/start-web-ide.sh +0 -0
  214. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/__init__.py +0 -0
  215. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/broker_log.py +0 -0
  216. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cli_hitl.py +0 -0
  217. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cli_log.py +0 -0
  218. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cost_collector_log.py +0 -0
  219. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/file_storage.py +0 -0
  220. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/http_callback_log.py +0 -0
  221. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/ide_log.py +0 -0
  222. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/lua_tools.py +0 -0
  223. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/mcp.py +0 -0
  224. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/mcp_manager.py +0 -0
  225. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/memory.py +0 -0
  226. {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/plugins.py +0 -0
  227. {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/http_backend.py +0 -0
  228. {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/model_backend.py +0 -0
  229. {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/pytorch_backend.py +0 -0
  230. {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/__init__.py +0 -0
  231. {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/client.py +0 -0
  232. {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/protocol.py +0 -0
  233. {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/server.py +0 -0
  234. {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/stdio.py +0 -0
  235. {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/__init__.py +0 -0
  236. {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/app.py +0 -0
  237. {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/commands/__init__.py +0 -0
  238. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/__init__.py +0 -0
  239. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/config_manager.py +0 -0
  240. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dependencies/__init__.py +0 -0
  241. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dependencies/registry.py +0 -0
  242. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dsl_stubs.py +0 -0
  243. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/exceptions.py +0 -0
  244. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/execution_context.py +0 -0
  245. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/lua_sandbox.py +0 -0
  246. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/message_history_manager.py +0 -0
  247. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/mocking.py +0 -0
  248. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/output_validator.py +0 -0
  249. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/registry.py +0 -0
  250. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/runtime.py +0 -0
  251. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/template_resolver.py +0 -0
  252. {tactus-0.28.0 → tactus-0.29.1}/tactus/core/yaml_parser.py +0 -0
  253. {tactus-0.28.0 → tactus-0.29.1}/tactus/docker/Dockerfile +0 -0
  254. {tactus-0.28.0 → tactus-0.29.1}/tactus/docker/entrypoint.sh +0 -0
  255. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/__init__.py +0 -0
  256. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/agent.py +0 -0
  257. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/broker_lm.py +0 -0
  258. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/config.py +0 -0
  259. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/history.py +0 -0
  260. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/module.py +0 -0
  261. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/prediction.py +0 -0
  262. {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/signature.py +0 -0
  263. {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/__init__.py +0 -0
  264. {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/coding_assistant.py +0 -0
  265. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/__init__.py +0 -0
  266. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/control.py +0 -0
  267. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/file.py +0 -0
  268. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/handles.py +0 -0
  269. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/host.py +0 -0
  270. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/human.py +0 -0
  271. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/json.py +0 -0
  272. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/log.py +0 -0
  273. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/message_history.py +0 -0
  274. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/model.py +0 -0
  275. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/procedure.py +0 -0
  276. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/procedure_callable.py +0 -0
  277. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/retry.py +0 -0
  278. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/session.py +0 -0
  279. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/stage.py +0 -0
  280. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/state.py +0 -0
  281. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/step.py +0 -0
  282. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/system.py +0 -0
  283. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/tool.py +0 -0
  284. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/tool_handle.py +0 -0
  285. {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/toolset.py +0 -0
  286. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/__init__.py +0 -0
  287. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/chat_recorder.py +0 -0
  288. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/config.py +0 -0
  289. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/cost.py +0 -0
  290. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/hitl.py +0 -0
  291. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/log_handler.py +0 -0
  292. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/models.py +0 -0
  293. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/result.py +0 -0
  294. {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/storage.py +0 -0
  295. {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/__init__.py +0 -0
  296. {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/base.py +0 -0
  297. {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/bedrock.py +0 -0
  298. {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/google.py +0 -0
  299. {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/openai.py +0 -0
  300. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/__init__.py +0 -0
  301. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/docker_manager.py +0 -0
  302. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/entrypoint.py +0 -0
  303. {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/protocol.py +0 -0
  304. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/__init__.py +0 -0
  305. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/__init__.py +0 -0
  306. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/csv.py +0 -0
  307. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/excel.py +0 -0
  308. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/file.py +0 -0
  309. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/fs.py +0 -0
  310. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/hdf5.py +0 -0
  311. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/json.py +0 -0
  312. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/parquet.py +0 -0
  313. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/tsv.py +0 -0
  314. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/loader.py +0 -0
  315. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
  316. {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
  317. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/README.md +0 -0
  318. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/__init__.py +0 -0
  319. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/behave_integration.py +0 -0
  320. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/context.py +0 -0
  321. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/eval_models.py +0 -0
  322. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/evaluation_runner.py +0 -0
  323. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/evaluators.py +0 -0
  324. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/events.py +0 -0
  325. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/gherkin_parser.py +0 -0
  326. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_agent.py +0 -0
  327. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_dependencies.py +0 -0
  328. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_hitl.py +0 -0
  329. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_registry.py +0 -0
  330. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_tools.py +0 -0
  331. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/models.py +0 -0
  332. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/pydantic_eval_runner.py +0 -0
  333. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/__init__.py +0 -0
  334. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/builtin.py +0 -0
  335. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/custom.py +0 -0
  336. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/registry.py +0 -0
  337. {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/test_runner.py +0 -0
  338. {tactus-0.28.0 → tactus-0.29.1}/tactus/tracing/__init__.py +0 -0
  339. {tactus-0.28.0 → tactus-0.29.1}/tactus/tracing/trace_manager.py +0 -0
  340. {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/__init__.py +0 -0
  341. {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/cost_calculator.py +0 -0
  342. {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/model_pricing.py +0 -0
  343. {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/safe_file_library.py +0 -0
  344. {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/safe_libraries.py +0 -0
  345. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/LuaLexerBase.py +0 -0
  346. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/LuaParserBase.py +0 -0
  347. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/README.md +0 -0
  348. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/__init__.py +0 -0
  349. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/error_listener.py +0 -0
  350. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.interp +0 -0
  351. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.py +0 -0
  352. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
  353. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
  354. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.interp +0 -0
  355. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.py +0 -0
  356. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.tokens +0 -0
  357. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParserBase.py +0 -0
  358. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  359. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/__init__.py +0 -0
  360. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  361. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
  362. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/semantic_visitor.py +0 -0
  363. {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/validator.py +0 -0
  364. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/.gitignore +0 -0
  365. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/README.md +0 -0
  366. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
  367. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  368. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/backend/hook-lupa.py +0 -0
  369. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/package-lock.json +0 -0
  370. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/preload/preload.ts +0 -0
  371. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/preload/tsconfig.json +0 -0
  372. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/rebuild-and-test.sh +0 -0
  373. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/scripts/build-backend.js +0 -0
  374. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/scripts/build-frontend.js +0 -0
  375. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/backend-manager.ts +0 -0
  376. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/main.ts +0 -0
  377. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/menu.ts +0 -0
  378. {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/tsconfig.json +0 -0
  379. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/ARCHITECTURE.md +0 -0
  380. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/CHANGELOG.md +0 -0
  381. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/DEV_MODE.md +0 -0
  382. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/QUICK_START.md +0 -0
  383. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/README.md +0 -0
  384. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  385. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
  386. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/README.md +0 -0
  387. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/assistant_service.py +0 -0
  388. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/assistant_tools.py +0 -0
  389. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/chat_server.py +0 -0
  390. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/config_server.py +0 -0
  391. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/events.py +0 -0
  392. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/logging_capture.py +0 -0
  393. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/lsp_server.py +0 -0
  394. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/requirements.txt +0 -0
  395. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  396. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/test_lsp_server.py +0 -0
  397. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/text_editor_tool.py +0 -0
  398. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/dev.sh +0 -0
  399. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
  400. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  401. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  402. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/README.md +0 -0
  403. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/demo.ts +0 -0
  404. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/index.html +0 -0
  405. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/jest.config.js +0 -0
  406. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/package-lock.json +0 -0
  407. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/package.json +0 -0
  408. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/postcss.config.js +0 -0
  409. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/App.tsx +0 -0
  410. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
  411. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  412. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  413. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  414. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  415. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
  416. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
  417. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  418. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +1 -1
  419. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  420. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  421. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  422. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  423. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
  424. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
  425. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  426. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  427. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  428. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  429. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  430. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  431. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  432. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  433. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
  434. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
  435. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  436. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  437. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  438. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
  439. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
  440. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
  441. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  442. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  443. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  444. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  445. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  446. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  447. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  448. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  449. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  450. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  451. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  452. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  453. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
  454. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
  455. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
  456. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  457. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
  458. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  459. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  460. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
  461. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  462. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  463. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  464. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  465. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  466. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
  467. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  468. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  469. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  470. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  471. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  472. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  473. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  474. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
  475. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  476. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  477. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  478. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  479. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  480. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  481. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  482. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  483. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  484. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  485. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  486. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
  487. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
  488. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
  489. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  490. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  491. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  492. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  493. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  494. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  495. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  496. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  497. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
  498. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  499. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  500. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  501. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  502. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
  503. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  504. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  505. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  506. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
  507. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  508. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
  509. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  510. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
  511. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
  512. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
  513. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  514. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/index.css +0 -0
  515. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  516. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/main.tsx +0 -0
  517. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/events.ts +0 -0
  518. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  519. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/preferences.ts +0 -0
  520. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/results.ts +0 -0
  521. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  522. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
  523. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  524. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  525. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  526. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
  527. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  528. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tailwind.config.js +0 -0
  529. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tsconfig.json +0 -0
  530. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
  531. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/vite.config.ts +0 -0
  532. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  533. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/package.json +0 -0
  534. {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/start-dev.sh +0 -0
  535. {tactus-0.28.0 → tactus-0.29.1}/test-ci.sh +0 -0
  536. {tactus-0.28.0 → tactus-0.29.1}/tests/__init__.py +0 -0
  537. {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/__init__.py +0 -0
  538. {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
  539. {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/test_plugins.py +0 -0
  540. {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_host_tool_source.py +0 -0
  541. {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_integration.py +0 -0
  542. {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_tcp_integration.py +0 -0
  543. {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_tcp_unit.py +0 -0
  544. {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_brokered_lm_unit.py +0 -0
  545. {tactus-0.28.0 → tactus-0.29.1}/tests/cli/__init__.py +0 -0
  546. {tactus-0.28.0 → tactus-0.29.1}/tests/cli/test_cli.py +0 -0
  547. {tactus-0.28.0 → tactus-0.29.1}/tests/cli/test_cli_inputs.py +0 -0
  548. {tactus-0.28.0 → tactus-0.29.1}/tests/conftest.py +0 -0
  549. {tactus-0.28.0 → tactus-0.29.1}/tests/core/__init__.py +0 -0
  550. {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_config_manager.py +0 -0
  551. {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_determinism_safety.py +0 -0
  552. {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_lua_sandbox_security.py +0 -0
  553. {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_runtime_inputs.py +0 -0
  554. {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_script_mode.py +0 -0
  555. {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/__init__.py +0 -0
  556. {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_mock_field_normalization.py +0 -0
  557. {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_module_parameter.py +0 -0
  558. {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_prediction_messages.py +0 -0
  559. {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_streaming.py +0 -0
  560. {tactus-0.28.0 → tactus-0.29.1}/tests/fixtures/__init__.py +0 -0
  561. {tactus-0.28.0 → tactus-0.29.1}/tests/fixtures/test_mcp_server.py +0 -0
  562. {tactus-0.28.0 → tactus-0.29.1}/tests/integration/test_named_procedures.py +0 -0
  563. {tactus-0.28.0 → tactus-0.29.1}/tests/mocks/__init__.py +0 -0
  564. {tactus-0.28.0 → tactus-0.29.1}/tests/mocks/llm_mocks.py +0 -0
  565. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_checkpoint_primitive.py +0 -0
  566. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_host_primitive.py +0 -0
  567. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_retry_primitive.py +0 -0
  568. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_state_primitive.py +0 -0
  569. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_system_alert.py +0 -0
  570. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_tool_primitive.py +0 -0
  571. {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_toolset_dsl.py +0 -0
  572. {tactus-0.28.0 → tactus-0.29.1}/tests/sandbox/test_container_runner.py +0 -0
  573. {tactus-0.28.0 → tactus-0.29.1}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
  574. {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/__init__.py +0 -0
  575. {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/test_loader.py +0 -0
  576. {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/test_require_python.py +0 -0
  577. {tactus-0.28.0 → tactus-0.29.1}/tests/test_checkpoints_integration.py +0 -0
  578. {tactus-0.28.0 → tactus-0.29.1}/tests/test_mcp_integration.py +0 -0
  579. {tactus-0.28.0 → tactus-0.29.1}/tests/test_tracing.py +0 -0
  580. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/__init__.py +0 -0
  581. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/conftest.py +0 -0
  582. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_all_examples.py +0 -0
  583. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_e2e.py +0 -0
  584. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_gherkin_parser.py +0 -0
  585. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_integration.py +0 -0
  586. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_models.py +0 -0
  587. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_runtime_integration.py +0 -0
  588. {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_step_registry.py +0 -0
  589. {tactus-0.28.0 → tactus-0.29.1}/tests/utils/__init__.py +0 -0
  590. {tactus-0.28.0 → tactus-0.29.1}/tests/utils/test_safe_file_library.py +0 -0
  591. {tactus-0.28.0 → tactus-0.29.1}/tests/validation/__init__.py +0 -0
  592. {tactus-0.28.0 → tactus-0.29.1}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
@@ -0,0 +1,177 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+ pull_request:
8
+ branches:
9
+ - '**'
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ quality-checks:
16
+ name: Quality Checks
17
+ runs-on: ubuntu-latest
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: '3.11'
29
+ cache: 'pip'
30
+
31
+ - name: Install dependencies
32
+ run: |
33
+ python -m pip install --upgrade pip
34
+ pip install -e ".[dev]"
35
+
36
+ - name: Run ruff linting
37
+ run: ruff check tactus/ tests/ features/steps/
38
+
39
+ - name: Run black formatting check
40
+ run: black --check tactus/ tests/ features/steps/
41
+
42
+ - name: Run pytest tests
43
+ run: pytest tests/ -v --tb=short -m "not integration" -n0
44
+
45
+ - name: Run behave BDD tests
46
+ run: behave
47
+
48
+ release:
49
+ name: Semantic Release
50
+ runs-on: ubuntu-latest
51
+ needs: quality-checks
52
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
53
+ permissions:
54
+ contents: write
55
+ id-token: write
56
+
57
+ steps:
58
+ - name: Checkout code
59
+ uses: actions/checkout@v4
60
+ with:
61
+ fetch-depth: 0
62
+ token: ${{ secrets.GH_TOKEN }}
63
+
64
+ - name: Set up Python
65
+ uses: actions/setup-python@v5
66
+ with:
67
+ python-version: '3.11'
68
+ cache: 'pip'
69
+
70
+ - name: Install python-semantic-release
71
+ run: |
72
+ python -m pip install --upgrade pip
73
+ pip install python-semantic-release
74
+
75
+ - name: Python Semantic Release
76
+ env:
77
+ GH_TOKEN: ${{ secrets.GH_TOKEN }}
78
+ PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
79
+ run: |
80
+ git config user.name "github-actions[bot]"
81
+ git config user.email "github-actions[bot]@users.noreply.github.com"
82
+ semantic-release version
83
+ semantic-release publish
84
+
85
+ - name: Publish to PyPI
86
+ if: success() && hashFiles('dist/*') != ''
87
+ env:
88
+ TWINE_USERNAME: __token__
89
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
90
+ run: |
91
+ pip install twine
92
+ twine upload --skip-existing dist/*
93
+
94
+ desktop-builds:
95
+ name: Build Desktop Apps
96
+ runs-on: ${{ matrix.os }}
97
+ needs: release
98
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
99
+ strategy:
100
+ matrix:
101
+ os: [macos-latest, windows-latest, ubuntu-latest]
102
+
103
+ steps:
104
+ - name: Checkout code
105
+ uses: actions/checkout@v4
106
+
107
+ - name: Setup Node.js
108
+ uses: actions/setup-node@v4
109
+ with:
110
+ node-version: '18'
111
+
112
+ - name: Setup Python
113
+ uses: actions/setup-python@v5
114
+ with:
115
+ python-version: '3.11'
116
+
117
+ - name: Install Python dependencies
118
+ run: |
119
+ python -m pip install --upgrade pip
120
+ pip install pyinstaller
121
+ pip install -e .
122
+
123
+ - name: Install Node dependencies (Desktop)
124
+ working-directory: ./tactus-desktop
125
+ run: npm install
126
+
127
+ - name: Build Frontend
128
+ working-directory: ./tactus-desktop
129
+ run: npm run build:frontend
130
+
131
+ - name: Build Backend
132
+ working-directory: ./tactus-desktop
133
+ run: npm run build:backend
134
+
135
+ - name: Build Electron
136
+ working-directory: ./tactus-desktop
137
+ run: npm run build
138
+
139
+ - name: Package Application (macOS)
140
+ if: matrix.os == 'macos-latest'
141
+ working-directory: ./tactus-desktop
142
+ run: npm run package:mac
143
+
144
+ - name: Package Application (Windows)
145
+ if: matrix.os == 'windows-latest'
146
+ working-directory: ./tactus-desktop
147
+ run: npm run package:win
148
+
149
+ - name: Package Application (Linux)
150
+ if: matrix.os == 'ubuntu-latest'
151
+ working-directory: ./tactus-desktop
152
+ run: npm run package:linux
153
+
154
+ - name: Upload Desktop Artifacts
155
+ uses: actions/upload-artifact@v4
156
+ with:
157
+ name: desktop-${{ matrix.os }}
158
+ path: tactus-desktop/dist-electron/*
159
+
160
+ - name: Get latest release tag
161
+ id: version
162
+ run: |
163
+ # Get the latest tag created by semantic-release
164
+ git fetch --tags
165
+ LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
166
+ echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
167
+ shell: bash
168
+
169
+ - name: Attach Desktop Builds to Release
170
+ if: success()
171
+ uses: softprops/action-gh-release@v1
172
+ with:
173
+ tag_name: ${{ steps.version.outputs.tag }}
174
+ files: tactus-desktop/dist-electron/*
175
+ fail_on_unmatched_files: false
176
+ env:
177
+ GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
@@ -158,6 +158,63 @@ make generate-typescript-parser
158
158
  - `tactus/validation/generated/*.py` - Python parser
159
159
  - `tactus-ide/frontend/src/validation/generated/*.ts` - TypeScript parser
160
160
 
161
+ ## Container Development Mode
162
+
163
+ **IMPORTANT**: The sandbox container uses development mode to avoid constant rebuilds during active development.
164
+
165
+ ### What is Development Mode?
166
+
167
+ Development mode (`dev_mode: true`) mounts your live Tactus source code into the container at runtime. This means:
168
+ - Code changes are **instantly available** in containers
169
+ - No rebuilding needed after changes
170
+ - No version mismatch errors between host and container
171
+
172
+ ### How It Works
173
+
174
+ The IDE automatically enables dev mode. The system finds your Tactus repository via:
175
+ 1. `TACTUS_DEV_PATH` environment variable (if set)
176
+ 2. Python module location (`tactus.__file__` when installed with `pip install -e .`)
177
+ 3. Current working directory (if it contains `tactus/` and `pyproject.toml`)
178
+
179
+ ### For Tactus Developers (Typical Workflow)
180
+
181
+ If you installed Tactus with `pip install -e .` from a repo clone:
182
+ - ✅ Dev mode works automatically everywhere
183
+ - ✅ No manual configuration needed
184
+ - ✅ No need to be in repo directory
185
+
186
+ ### Initial Container Build
187
+
188
+ Build the container once initially:
189
+ ```bash
190
+ docker build -t tactus-sandbox:local -f tactus/docker/Dockerfile .
191
+ ```
192
+
193
+ After that, code changes are instantly available with dev mode enabled.
194
+
195
+ ### When Dev Mode Activates
196
+
197
+ You'll see this log message:
198
+ ```
199
+ INFO:tactus.sandbox.container_runner:[DEV MODE] Mounting live Tactus source from: /path/to/Tactus
200
+ ```
201
+
202
+ If it can't find the source (e.g., PyPI-installed Tactus), you'll see:
203
+ ```
204
+ WARNING:tactus.sandbox.container_runner:[DEV MODE] Could not locate Tactus source directory, using baked-in version
205
+ ```
206
+
207
+ ### When to Rebuild Container
208
+
209
+ Only rebuild when:
210
+ - Changing dependencies in `pyproject.toml`
211
+ - Updating base system packages in Dockerfile
212
+ - Dev mode cannot find your source (rare)
213
+
214
+ **Never rebuild for regular code changes** - that's what dev mode prevents.
215
+
216
+ See [docs/development-mode.md](docs/development-mode.md) for complete details.
217
+
161
218
  ## Tactus IDE Development
162
219
 
163
220
  When working on the Tactus IDE:
@@ -2,6 +2,27 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.29.1 (2026-01-15)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Add type module to tactus-desktop package.json for ES module support
10
+ ([`7b0bdaa`](https://github.com/AnthusAI/Tactus/commit/7b0bdaa8272f010be73137ed1f727b0bfad48827))
11
+
12
+
13
+ ## v0.29.0 (2026-01-15)
14
+
15
+ ### Code Style
16
+
17
+ - Run black formatter on container_runner.py
18
+ ([`9338945`](https://github.com/AnthusAI/Tactus/commit/93389452b4a059607e4d50535b8bac348c085ab1))
19
+
20
+ ### Features
21
+
22
+ - **desktop**: Integrate Electron desktop builds into semantic-release workflow
23
+ ([`77a1fbe`](https://github.com/AnthusAI/Tactus/commit/77a1fbe2e9807c1e6a6ad12c574cdae6f1687f73))
24
+
25
+
5
26
  ## v0.28.0 (2026-01-14)
6
27
 
7
28
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.28.0
3
+ Version: 0.29.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
@@ -0,0 +1,128 @@
1
+ # Development Mode for Sandbox Container
2
+
3
+ ## Problem
4
+
5
+ During development, the Tactus sandbox container has the Tactus code baked in at build time. This means:
6
+ - Every code change requires rebuilding the container
7
+ - Forgetting to rebuild causes obscure errors from version mismatches
8
+ - Development iteration is slow
9
+
10
+ ## Solution: Development Mode with Live Mounting
11
+
12
+ Development mode (`dev_mode: true`) mounts your local Tactus source code into the container at runtime instead of using the baked-in version.
13
+
14
+ ### How It Works
15
+
16
+ When `dev_mode` is enabled, the container runner:
17
+ 1. Detects the location of your Tactus repository
18
+ 2. Mounts the `tactus/` directory into the container at `/app/tactus`
19
+ 3. Python's editable install (`pip install -e .`) picks up the live code
20
+
21
+ This means code changes are **immediately available** in the container without rebuilding.
22
+
23
+ ### Automatic Repository Detection
24
+
25
+ **Important:** The detection happens on the **host machine** (where `tactus` CLI or IDE is running), not inside the container.
26
+
27
+ The system automatically finds your Tactus repository in this order:
28
+
29
+ 1. **`TACTUS_DEV_PATH` environment variable** (explicit override)
30
+ ```bash
31
+ export TACTUS_DEV_PATH=/path/to/Tactus
32
+ ```
33
+
34
+ 2. **Python module location** (if installed with `pip install -e .`)
35
+ - When you run `pip install -e .` from a Tactus repo, Python remembers where the source is
36
+ - The code reads `tactus.__file__` which points to the actual `.py` file location
37
+ - Example: If `tactus` was installed from `/Users/you/Projects/Tactus`, then:
38
+ - `tactus.__file__` → `/Users/you/Projects/Tactus/tactus/__init__.py`
39
+ - Repo root → `/Users/you/Projects/Tactus`
40
+ - This works **even if you run from a different directory**
41
+
42
+ 3. **Current working directory** (if it contains `tactus/` and `pyproject.toml`)
43
+ - Only used if methods 1 and 2 fail
44
+
45
+ ### How Does This Work Remotely?
46
+
47
+ **Scenario 1: Development from Tactus repo**
48
+ - You: Clone Tactus, run `pip install -e .`, start IDE from anywhere
49
+ - Detection: Method #2 finds it via `tactus.__file__`
50
+ - Result: ✅ Dev mode works
51
+
52
+ **Scenario 2: Installed from PyPI (`pip install tactus`)**
53
+ - You: Client project, no Tactus repo nearby
54
+ - Detection: `tactus.__file__` points to site-packages (not a repo)
55
+ - Result: ❌ Dev mode cannot find source, falls back to baked-in version
56
+
57
+ **Scenario 3: Multiple Tactus clones**
58
+ - You: Have Tactus installed in multiple locations
59
+ - Detection: Uses whichever one Python loads (first in `sys.path`)
60
+ - Override: Set `TACTUS_DEV_PATH` to choose explicitly
61
+
62
+ ### When Dev Mode is Enabled
63
+
64
+ **IDE (tactus-ide)**: Dev mode is **automatically enabled** by default.
65
+
66
+ **CLI**: Enable via config or environment:
67
+ ```bash
68
+ # Via environment variable
69
+ export TACTUS_SANDBOX_DEV_MODE=true
70
+ tactus run procedure.tac
71
+
72
+ # Via config file (.tactus.toml)
73
+ [sandbox]
74
+ dev_mode = true
75
+ ```
76
+
77
+ ### When to Use Each Mode
78
+
79
+ | Mode | Use Case | Rebuild Needed? |
80
+ |------|----------|----------------|
81
+ | **Dev Mode (dev_mode: true)** | Active development, testing changes | No - code is live mounted |
82
+ | **Production Mode (dev_mode: false)** | Released containers, CI/CD, client usage | Yes - code is baked in |
83
+
84
+ ### Limitations
85
+
86
+ **Dev mode only works when:**
87
+ - Tactus was installed via `pip install -e .` from a repo clone
88
+ - Or `TACTUS_DEV_PATH` environment variable is set
89
+ - Or running from within a Tactus repository directory
90
+
91
+ **If running from a client project with PyPI-installed Tactus:**
92
+ - Dev mode cannot find the source (no repo exists)
93
+ - Gracefully falls back to using the baked-in version
94
+ - Container must be rebuilt to update (but this is expected for production use)
95
+
96
+ **The key benefit:** For Tactus developers (using `pip install -e .`), dev mode works **everywhere** - you don't need to `cd` into the repo or rebuild containers during development.
97
+
98
+ ### Logs
99
+
100
+ When dev mode activates, you'll see:
101
+ ```
102
+ INFO:tactus.sandbox.container_runner:[DEV MODE] Mounting live Tactus source from: /path/to/Tactus
103
+ ```
104
+
105
+ If it can't find the source:
106
+ ```
107
+ WARNING:tactus.sandbox.container_runner:[DEV MODE] Could not locate Tactus source directory, using baked-in version
108
+ ```
109
+
110
+ ## Initial Container Build
111
+
112
+ You still need to build the container once initially to get the base dependencies:
113
+ ```bash
114
+ docker build -t tactus-sandbox:local -f tactus/docker/Dockerfile .
115
+ ```
116
+
117
+ But after that, code changes are instantly available with dev mode enabled.
118
+
119
+ ## Future Enhancement: Published Containers
120
+
121
+ For production use cases, Tactus could publish versioned containers to Docker Hub:
122
+ - `anthus/tactus-sandbox:0.26.0`
123
+ - `anthus/tactus-sandbox:latest`
124
+
125
+ Users would then:
126
+ - Pull the appropriate version: `docker pull anthus/tactus-sandbox:0.26.0`
127
+ - Set `sandbox.image: "anthus/tactus-sandbox:0.26.0"` in their config
128
+ - Never need to build containers themselves
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tactus"
7
- version = "0.28.0"
7
+ version = "0.29.1"
8
8
  description = "Tactus: Lua-based DSL for agentic workflows"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,7 +5,7 @@ Tactus provides a declarative workflow engine for AI agents with pluggable
5
5
  backends for storage, HITL, and chat recording.
6
6
  """
7
7
 
8
- __version__ = "0.28.0"
8
+ __version__ = "0.29.1"
9
9
 
10
10
  # Core exports
11
11
  from tactus.core.runtime import TactusRuntime
@@ -770,7 +770,8 @@ def create_app(initial_workspace: Optional[str] = None, frontend_dist_dir: Optio
770
770
  from tactus.sandbox import is_docker_available, SandboxConfig, ContainerRunner
771
771
 
772
772
  docker_available, docker_reason = is_docker_available()
773
- sandbox_config = SandboxConfig()
773
+ # Enable dev_mode by default in IDE for live code mounting
774
+ sandbox_config = SandboxConfig(dev_mode=True)
774
775
  use_sandbox = docker_available and not sandbox_config.is_explicitly_disabled()
775
776
 
776
777
  if use_sandbox:
@@ -111,6 +111,12 @@ class SandboxConfig(BaseModel):
111
111
  description="Maximum execution time in seconds before container is killed",
112
112
  )
113
113
 
114
+ # Development mode: mount live Tactus source code
115
+ dev_mode: bool = Field(
116
+ default=False,
117
+ description="Enable development mode: mount live Tactus source code instead of using baked-in version",
118
+ )
119
+
114
120
  def get_mcp_servers_path(self) -> Path:
115
121
  """Get the expanded MCP servers path."""
116
122
  return Path(self.mcp_servers_path).expanduser()
@@ -171,6 +171,44 @@ class ContainerRunner:
171
171
  else:
172
172
  logger.debug("Sandbox is up to date")
173
173
 
174
+ def _find_tactus_source_dir(self) -> Optional[Path]:
175
+ """
176
+ Find the Tactus source directory for development mode.
177
+
178
+ Searches in order:
179
+ 1. TACTUS_DEV_PATH environment variable
180
+ 2. Directory containing the tactus module (via __file__)
181
+ 3. Current working directory if it contains tactus/ subdirectory
182
+
183
+ Returns:
184
+ Path to Tactus repository root, or None if not found.
185
+ """
186
+ # Option 1: Explicit environment variable
187
+ env_path = os.environ.get("TACTUS_DEV_PATH")
188
+ if env_path:
189
+ path = Path(env_path).resolve()
190
+ if path.exists() and (path / "tactus").is_dir():
191
+ return path
192
+
193
+ # Option 2: Find via the tactus module location
194
+ try:
195
+ import tactus
196
+
197
+ tactus_module_path = Path(tactus.__file__).resolve()
198
+ # Go up from tactus/__init__.py to the repo root
199
+ repo_root = tactus_module_path.parent.parent
200
+ if (repo_root / "tactus").is_dir() and (repo_root / "pyproject.toml").exists():
201
+ return repo_root
202
+ except Exception:
203
+ pass
204
+
205
+ # Option 3: Check current working directory
206
+ cwd = Path.cwd()
207
+ if (cwd / "tactus").is_dir() and (cwd / "pyproject.toml").exists():
208
+ return cwd
209
+
210
+ return None
211
+
174
212
  def _build_docker_command(
175
213
  self,
176
214
  working_dir: Path,
@@ -222,6 +260,17 @@ class ContainerRunner:
222
260
  if mcp_servers_path and mcp_servers_path.exists():
223
261
  cmd.extend(["-v", f"{mcp_servers_path}:/mcp-servers:ro"])
224
262
 
263
+ # Development mode: mount live Tactus source code
264
+ if self.config.dev_mode:
265
+ tactus_src_dir = self._find_tactus_source_dir()
266
+ if tactus_src_dir:
267
+ logger.info(f"[DEV MODE] Mounting live Tactus source from: {tactus_src_dir}")
268
+ cmd.extend(["-v", f"{tactus_src_dir}/tactus:/app/tactus:ro"])
269
+ else:
270
+ logger.warning(
271
+ "[DEV MODE] Could not locate Tactus source directory, using baked-in version"
272
+ )
273
+
225
274
  # Additional user-configured volumes
226
275
  for volume in self.config.volumes:
227
276
  cmd.extend(["-v", self._normalize_volume_spec(volume, base_dir=volume_base_dir)])