tactus 0.32.1__tar.gz → 0.33.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 (598) hide show
  1. {tactus-0.32.1 → tactus-0.33.0}/.github/workflows/release.yml +3 -3
  2. {tactus-0.32.1 → tactus-0.33.0}/CHANGELOG.md +21 -0
  3. {tactus-0.32.1 → tactus-0.33.0}/PKG-INFO +1 -1
  4. {tactus-0.32.1 → tactus-0.33.0}/pyproject.toml +1 -1
  5. {tactus-0.32.1 → tactus-0.33.0}/tactus/__init__.py +1 -1
  6. tactus-0.33.0/tactus-desktop/DISTRIBUTION.md +205 -0
  7. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/README.md +41 -5
  8. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/package.json +3 -1
  9. {tactus-0.32.1 → tactus-0.33.0}/.claude/agents.md +0 -0
  10. {tactus-0.32.1 → tactus-0.33.0}/.gitignore +0 -0
  11. {tactus-0.32.1 → tactus-0.33.0}/.tactus/config.yml.example +0 -0
  12. {tactus-0.32.1 → tactus-0.33.0}/AGENTS.md +0 -0
  13. {tactus-0.32.1 → tactus-0.33.0}/IMPLEMENTATION.md +0 -0
  14. {tactus-0.32.1 → tactus-0.33.0}/LICENSE +0 -0
  15. {tactus-0.32.1 → tactus-0.33.0}/Makefile +0 -0
  16. {tactus-0.32.1 → tactus-0.33.0}/README.md +0 -0
  17. {tactus-0.32.1 → tactus-0.33.0}/SPECIFICATION.md +0 -0
  18. {tactus-0.32.1 → tactus-0.33.0}/TECHNICAL_DEBT.md +0 -0
  19. {tactus-0.32.1 → tactus-0.33.0}/behave.ini +0 -0
  20. {tactus-0.32.1 → tactus-0.33.0}/docs/AGENTS.md +0 -0
  21. {tactus-0.32.1 → tactus-0.33.0}/docs/BDD_TESTING.md +0 -0
  22. {tactus-0.32.1 → tactus-0.33.0}/docs/CONFIGURATION.md +0 -0
  23. {tactus-0.32.1 → tactus-0.33.0}/docs/DURABILITY.md +0 -0
  24. {tactus-0.32.1 → tactus-0.33.0}/docs/FILE_IO.md +0 -0
  25. {tactus-0.32.1 → tactus-0.33.0}/docs/SANDBOXING.md +0 -0
  26. {tactus-0.32.1 → tactus-0.33.0}/docs/STREAMING.md +0 -0
  27. {tactus-0.32.1 → tactus-0.33.0}/docs/TOOLS.md +0 -0
  28. {tactus-0.32.1 → tactus-0.33.0}/docs/TOOL_ROADMAP.md +0 -0
  29. {tactus-0.32.1 → tactus-0.33.0}/docs/development-mode.md +0 -0
  30. {tactus-0.32.1 → tactus-0.33.0}/examples/.tactus/config.yml +0 -0
  31. {tactus-0.32.1 → tactus-0.33.0}/examples/.tactus/config.yml.example +0 -0
  32. {tactus-0.32.1 → tactus-0.33.0}/examples/01-basics-hello-world.tac +0 -0
  33. {tactus-0.32.1 → tactus-0.33.0}/examples/02-basics-simple-logic.tac +0 -0
  34. {tactus-0.32.1 → tactus-0.33.0}/examples/03-basics-parameters.tac +0 -0
  35. {tactus-0.32.1 → tactus-0.33.0}/examples/04-basics-simple-agent.tac +0 -0
  36. {tactus-0.32.1 → tactus-0.33.0}/examples/05-basics-multi-model.tac +0 -0
  37. {tactus-0.32.1 → tactus-0.33.0}/examples/06-basics-streaming.tac +0 -0
  38. {tactus-0.32.1 → tactus-0.33.0}/examples/07-basics-bedrock.tac +0 -0
  39. {tactus-0.32.1 → tactus-0.33.0}/examples/08-basics-models.tac +0 -0
  40. {tactus-0.32.1 → tactus-0.33.0}/examples/09-basics-google-gemini.tac +0 -0
  41. {tactus-0.32.1 → tactus-0.33.0}/examples/10-feature-state.tac +0 -0
  42. {tactus-0.32.1 → tactus-0.33.0}/examples/11-feature-message-history.tac +0 -0
  43. {tactus-0.32.1 → tactus-0.33.0}/examples/12-feature-structured-output.tac +0 -0
  44. {tactus-0.32.1 → tactus-0.33.0}/examples/13-feature-session.tac +0 -0
  45. {tactus-0.32.1 → tactus-0.33.0}/examples/14-feature-per-turn-tools-simple.tac +0 -0
  46. {tactus-0.32.1 → tactus-0.33.0}/examples/14-feature-per-turn-tools.tac +0 -0
  47. {tactus-0.32.1 → tactus-0.33.0}/examples/15-feature-local-tools.tac +0 -0
  48. {tactus-0.32.1 → tactus-0.33.0}/examples/16-feature-toolsets-advanced.tac +0 -0
  49. {tactus-0.32.1 → tactus-0.33.0}/examples/17-feature-toolsets-dsl.tac +0 -0
  50. {tactus-0.32.1 → tactus-0.33.0}/examples/18-feature-lua-tools-individual.tac +0 -0
  51. {tactus-0.32.1 → tactus-0.33.0}/examples/18-feature-lua-tools-inline.tac +0 -0
  52. {tactus-0.32.1 → tactus-0.33.0}/examples/18-feature-lua-tools-toolset.tac +0 -0
  53. {tactus-0.32.1 → tactus-0.33.0}/examples/19-feature-direct-tool-calls.tac +0 -0
  54. {tactus-0.32.1 → tactus-0.33.0}/examples/20-bdd-complete.tac +0 -0
  55. {tactus-0.32.1 → tactus-0.33.0}/examples/21-bdd-passing.tac +0 -0
  56. {tactus-0.32.1 → tactus-0.33.0}/examples/22-bdd-fuzzy-matching.tac +0 -0
  57. {tactus-0.32.1 → tactus-0.33.0}/examples/30-eval-simple.tac +0 -0
  58. {tactus-0.32.1 → tactus-0.33.0}/examples/31-eval-demo.tac +0 -0
  59. {tactus-0.32.1 → tactus-0.33.0}/examples/32-eval-success-rate.tac +0 -0
  60. {tactus-0.32.1 → tactus-0.33.0}/examples/33-eval-thresholds.tac +0 -0
  61. {tactus-0.32.1 → tactus-0.33.0}/examples/34-eval-dataset.jsonl +0 -0
  62. {tactus-0.32.1 → tactus-0.33.0}/examples/34-eval-dataset.tac +0 -0
  63. {tactus-0.32.1 → tactus-0.33.0}/examples/35-eval-trace.tac +0 -0
  64. {tactus-0.32.1 → tactus-0.33.0}/examples/36-eval-advanced.tac +0 -0
  65. {tactus-0.32.1 → tactus-0.33.0}/examples/37-eval-comprehensive.tac +0 -0
  66. {tactus-0.32.1 → tactus-0.33.0}/examples/39-model-simple.tac +0 -0
  67. {tactus-0.32.1 → tactus-0.33.0}/examples/40-mcp-test.tac +0 -0
  68. {tactus-0.32.1 → tactus-0.33.0}/examples/40-model-text-classifier.tac +0 -0
  69. {tactus-0.32.1 → tactus-0.33.0}/examples/41-mcp-simple.tac +0 -0
  70. {tactus-0.32.1 → tactus-0.33.0}/examples/41-model-pytorch.tac +0 -0
  71. {tactus-0.32.1 → tactus-0.33.0}/examples/43-sub-procedure-simple.tac +0 -0
  72. {tactus-0.32.1 → tactus-0.33.0}/examples/44-sub-procedure-composition.tac +0 -0
  73. {tactus-0.32.1 → tactus-0.33.0}/examples/45-sub-procedure-recursive.tac +0 -0
  74. {tactus-0.32.1 → tactus-0.33.0}/examples/46-checkpoint-explicit.tac +0 -0
  75. {tactus-0.32.1 → tactus-0.33.0}/examples/47-checkpoint-expensive-ops.tac +0 -0
  76. {tactus-0.32.1 → tactus-0.33.0}/examples/48-script-mode-simple.tac +0 -0
  77. {tactus-0.32.1 → tactus-0.33.0}/examples/50-inputs-showcase.tac +0 -0
  78. {tactus-0.32.1 → tactus-0.33.0}/examples/51-inputs-calculator.tac +0 -0
  79. {tactus-0.32.1 → tactus-0.33.0}/examples/52-file-io-basics.tac +0 -0
  80. {tactus-0.32.1 → tactus-0.33.0}/examples/53-tsv-file-io.tac +0 -0
  81. {tactus-0.32.1 → tactus-0.33.0}/examples/54-json-file-io.tac +0 -0
  82. {tactus-0.32.1 → tactus-0.33.0}/examples/55-parquet-file-io.tac +0 -0
  83. {tactus-0.32.1 → tactus-0.33.0}/examples/56-hdf5-file-io.tac +0 -0
  84. {tactus-0.32.1 → tactus-0.33.0}/examples/57-excel-file-io.tac +0 -0
  85. {tactus-0.32.1 → tactus-0.33.0}/examples/58-text-file-io.tac +0 -0
  86. {tactus-0.32.1 → tactus-0.33.0}/examples/60-tool-sources.tac +0 -0
  87. {tactus-0.32.1 → tactus-0.33.0}/examples/61-inline-toolset-lua.tac +0 -0
  88. {tactus-0.32.1 → tactus-0.33.0}/examples/62-mcp-toolset-by-server.tac +0 -0
  89. {tactus-0.32.1 → tactus-0.33.0}/examples/63-toolset-import-from-file.tac +0 -0
  90. {tactus-0.32.1 → tactus-0.33.0}/examples/64-require-modules.tac +0 -0
  91. {tactus-0.32.1 → tactus-0.33.0}/examples/65-optional-state-demo.tac +0 -0
  92. {tactus-0.32.1 → tactus-0.33.0}/examples/66-host-tools-via-broker.tac +0 -0
  93. {tactus-0.32.1 → tactus-0.33.0}/examples/67-host-tool-source.tac +0 -0
  94. {tactus-0.32.1 → tactus-0.33.0}/examples/70-mocking-static.tac +0 -0
  95. {tactus-0.32.1 → tactus-0.33.0}/examples/71-mocking-temporal.tac +0 -0
  96. {tactus-0.32.1 → tactus-0.33.0}/examples/72-mocking-conditional.tac +0 -0
  97. {tactus-0.32.1 → tactus-0.33.0}/examples/99-misc-test-loading.tac +0 -0
  98. {tactus-0.32.1 → tactus-0.33.0}/examples/README.md +0 -0
  99. {tactus-0.32.1 → tactus-0.33.0}/examples/app_config.ini +0 -0
  100. {tactus-0.32.1 → tactus-0.33.0}/examples/data/sample.csv +0 -0
  101. {tactus-0.32.1 → tactus-0.33.0}/examples/demo_output.json +0 -0
  102. {tactus-0.32.1 → tactus-0.33.0}/examples/helpers/math_module.tac +0 -0
  103. {tactus-0.32.1 → tactus-0.33.0}/examples/helpers/product.tac +0 -0
  104. {tactus-0.32.1 → tactus-0.33.0}/examples/helpers/string_module.tac +0 -0
  105. {tactus-0.32.1 → tactus-0.33.0}/examples/helpers/sum.tac +0 -0
  106. {tactus-0.32.1 → tactus-0.33.0}/examples/helpers/text_tools.tac +0 -0
  107. {tactus-0.32.1 → tactus-0.33.0}/examples/inventory_summary.tsv +0 -0
  108. {tactus-0.32.1 → tactus-0.33.0}/examples/mock-config.json +0 -0
  109. {tactus-0.32.1 → tactus-0.33.0}/examples/models/README.md +0 -0
  110. {tactus-0.32.1 → tactus-0.33.0}/examples/models/create_sentiment_model.py +0 -0
  111. {tactus-0.32.1 → tactus-0.33.0}/examples/output_summary.txt +0 -0
  112. {tactus-0.32.1 → tactus-0.33.0}/examples/test-raw-module.tac +0 -0
  113. {tactus-0.32.1 → tactus-0.33.0}/examples/test-raw-streaming.tac +0 -0
  114. {tactus-0.32.1 → tactus-0.33.0}/examples/tools/calculations.py +0 -0
  115. {tactus-0.32.1 → tactus-0.33.0}/examples/tools/data_analysis.py +0 -0
  116. {tactus-0.32.1 → tactus-0.33.0}/examples/tools/search.py +0 -0
  117. {tactus-0.32.1 → tactus-0.33.0}/examples/with_dependencies/README.md +0 -0
  118. {tactus-0.32.1 → tactus-0.33.0}/examples/with_dependencies/simple_http_test.tac +0 -0
  119. {tactus-0.32.1 → tactus-0.33.0}/examples/with_dependencies/time_lookup.tac +0 -0
  120. {tactus-0.32.1 → tactus-0.33.0}/features/01_state_management.feature +0 -0
  121. {tactus-0.32.1 → tactus-0.33.0}/features/02_checkpointing.feature +0 -0
  122. {tactus-0.32.1 → tactus-0.33.0}/features/03_human_in_the_loop.feature +0 -0
  123. {tactus-0.32.1 → tactus-0.33.0}/features/04_control_flow.feature +0 -0
  124. {tactus-0.32.1 → tactus-0.33.0}/features/05_tool_integration.feature +0 -0
  125. {tactus-0.32.1 → tactus-0.33.0}/features/06_retry_logic.feature +0 -0
  126. {tactus-0.32.1 → tactus-0.33.0}/features/07_file_operations.feature +0 -0
  127. {tactus-0.32.1 → tactus-0.33.0}/features/08_agent_primitives.feature +0 -0
  128. {tactus-0.32.1 → tactus-0.33.0}/features/09_workflow_execution.feature +0 -0
  129. {tactus-0.32.1 → tactus-0.33.0}/features/10_lua_integration.feature +0 -0
  130. {tactus-0.32.1 → tactus-0.33.0}/features/11_storage_backends.feature +0 -0
  131. {tactus-0.32.1 → tactus-0.33.0}/features/12_json_operations.feature +0 -0
  132. {tactus-0.32.1 → tactus-0.33.0}/features/13_logging.feature +0 -0
  133. {tactus-0.32.1 → tactus-0.33.0}/features/15_procedure_calls.feature +0 -0
  134. {tactus-0.32.1 → tactus-0.33.0}/features/16_session_management.feature +0 -0
  135. {tactus-0.32.1 → tactus-0.33.0}/features/17_lua_dsl_validation.feature +0 -0
  136. {tactus-0.32.1 → tactus-0.33.0}/features/18_example_procedures.feature +0 -0
  137. {tactus-0.32.1 → tactus-0.33.0}/features/19_ide_server.feature +0 -0
  138. {tactus-0.32.1 → tactus-0.33.0}/features/20_parameters.feature +0 -0
  139. {tactus-0.32.1 → tactus-0.33.0}/features/21_outputs.feature +0 -0
  140. {tactus-0.32.1 → tactus-0.33.0}/features/23_prompts.feature +0 -0
  141. {tactus-0.32.1 → tactus-0.33.0}/features/24_bdd_specifications.feature +0 -0
  142. {tactus-0.32.1 → tactus-0.33.0}/features/25_bdd_custom_steps.feature +0 -0
  143. {tactus-0.32.1 → tactus-0.33.0}/features/26_bdd_evaluation.feature +0 -0
  144. {tactus-0.32.1 → tactus-0.33.0}/features/27_default_settings.feature +0 -0
  145. {tactus-0.32.1 → tactus-0.33.0}/features/28_custom_prompts.feature +0 -0
  146. {tactus-0.32.1 → tactus-0.33.0}/features/29_execution_settings.feature +0 -0
  147. {tactus-0.32.1 → tactus-0.33.0}/features/30_session_filters.feature +0 -0
  148. {tactus-0.32.1 → tactus-0.33.0}/features/31_matchers.feature +0 -0
  149. {tactus-0.32.1 → tactus-0.33.0}/features/32_result_object.feature +0 -0
  150. {tactus-0.32.1 → tactus-0.33.0}/features/33_output_type.feature +0 -0
  151. {tactus-0.32.1 → tactus-0.33.0}/features/42_model_primitive.feature +0 -0
  152. {tactus-0.32.1 → tactus-0.33.0}/features/43_sub_procedure_checkpointing.feature +0 -0
  153. {tactus-0.32.1 → tactus-0.33.0}/features/46_explicit_checkpoint.feature +0 -0
  154. {tactus-0.32.1 → tactus-0.33.0}/features/48_script_mode.feature +0 -0
  155. {tactus-0.32.1 → tactus-0.33.0}/features/51_dspy_lm_config.feature +0 -0
  156. {tactus-0.32.1 → tactus-0.33.0}/features/52_dspy_signature.feature +0 -0
  157. {tactus-0.32.1 → tactus-0.33.0}/features/53_dspy_module.feature +0 -0
  158. {tactus-0.32.1 → tactus-0.33.0}/features/54_dspy_history.feature +0 -0
  159. {tactus-0.32.1 → tactus-0.33.0}/features/55_dspy_prediction.feature +0 -0
  160. {tactus-0.32.1 → tactus-0.33.0}/features/56_dspy_agent.feature +0 -0
  161. {tactus-0.32.1 → tactus-0.33.0}/features/57_chat_assistant.feature +0 -0
  162. {tactus-0.32.1 → tactus-0.33.0}/features/60_formatting.feature +0 -0
  163. {tactus-0.32.1 → tactus-0.33.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  164. {tactus-0.32.1 → tactus-0.33.0}/features/documentation/Lua DSL/README.md +0 -0
  165. {tactus-0.32.1 → tactus-0.33.0}/features/environment.py +0 -0
  166. {tactus-0.32.1 → tactus-0.33.0}/features/steps/agent_primitives_steps.py +0 -0
  167. {tactus-0.32.1 → tactus-0.33.0}/features/steps/chat_assistant_steps.py +0 -0
  168. {tactus-0.32.1 → tactus-0.33.0}/features/steps/checkpointing_steps.py +0 -0
  169. {tactus-0.32.1 → tactus-0.33.0}/features/steps/control_flow_steps.py +0 -0
  170. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_agent_steps.py +0 -0
  171. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_history_steps.py +0 -0
  172. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_lm_steps.py +0 -0
  173. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_module_steps.py +0 -0
  174. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_prediction_steps.py +0 -0
  175. {tactus-0.32.1 → tactus-0.33.0}/features/steps/dspy_signature_steps.py +0 -0
  176. {tactus-0.32.1 → tactus-0.33.0}/features/steps/example_procedures_steps.py +0 -0
  177. {tactus-0.32.1 → tactus-0.33.0}/features/steps/file_operations_steps.py +0 -0
  178. {tactus-0.32.1 → tactus-0.33.0}/features/steps/formatting_steps.py +0 -0
  179. {tactus-0.32.1 → tactus-0.33.0}/features/steps/human_in_the_loop_steps.py +0 -0
  180. {tactus-0.32.1 → tactus-0.33.0}/features/steps/ide_server_steps.py +0 -0
  181. {tactus-0.32.1 → tactus-0.33.0}/features/steps/json_operations_steps.py +0 -0
  182. {tactus-0.32.1 → tactus-0.33.0}/features/steps/logging_steps.py +0 -0
  183. {tactus-0.32.1 → tactus-0.33.0}/features/steps/lua_dsl_validation_steps.py +0 -0
  184. {tactus-0.32.1 → tactus-0.33.0}/features/steps/lua_integration_steps.py +0 -0
  185. {tactus-0.32.1 → tactus-0.33.0}/features/steps/mocking_steps.py +0 -0
  186. {tactus-0.32.1 → tactus-0.33.0}/features/steps/procedure_calls_steps.py +0 -0
  187. {tactus-0.32.1 → tactus-0.33.0}/features/steps/result_and_output_steps.py +0 -0
  188. {tactus-0.32.1 → tactus-0.33.0}/features/steps/retry_logic_steps.py +0 -0
  189. {tactus-0.32.1 → tactus-0.33.0}/features/steps/session_management_steps.py +0 -0
  190. {tactus-0.32.1 → tactus-0.33.0}/features/steps/state_management_steps.py +0 -0
  191. {tactus-0.32.1 → tactus-0.33.0}/features/steps/storage_backend_steps.py +0 -0
  192. {tactus-0.32.1 → tactus-0.33.0}/features/steps/support/__init__.py +0 -0
  193. {tactus-0.32.1 → tactus-0.33.0}/features/steps/support/harnesses.py +0 -0
  194. {tactus-0.32.1 → tactus-0.33.0}/features/steps/tool_integration_steps.py +0 -0
  195. {tactus-0.32.1 → tactus-0.33.0}/features/steps/workflow_execution_steps.py +0 -0
  196. {tactus-0.32.1 → tactus-0.33.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
  197. {tactus-0.32.1 → tactus-0.33.0}/planning/FORMATTER.md +0 -0
  198. {tactus-0.32.1 → tactus-0.33.0}/scripts/audit_examples_mocking.py +0 -0
  199. {tactus-0.32.1 → tactus-0.33.0}/scripts/convert_examples.py +0 -0
  200. {tactus-0.32.1 → tactus-0.33.0}/scripts/run_precommit_suite.sh +0 -0
  201. {tactus-0.32.1 → tactus-0.33.0}/scripts/timeout.py +0 -0
  202. {tactus-0.32.1 → tactus-0.33.0}/start-web-ide.sh +0 -0
  203. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/__init__.py +0 -0
  204. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/broker_log.py +0 -0
  205. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/cli_hitl.py +0 -0
  206. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/cli_log.py +0 -0
  207. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/cost_collector_log.py +0 -0
  208. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/file_storage.py +0 -0
  209. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/http_callback_log.py +0 -0
  210. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/ide_log.py +0 -0
  211. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/lua_tools.py +0 -0
  212. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/mcp.py +0 -0
  213. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/mcp_manager.py +0 -0
  214. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/memory.py +0 -0
  215. {tactus-0.32.1 → tactus-0.33.0}/tactus/adapters/plugins.py +0 -0
  216. {tactus-0.32.1 → tactus-0.33.0}/tactus/backends/http_backend.py +0 -0
  217. {tactus-0.32.1 → tactus-0.33.0}/tactus/backends/model_backend.py +0 -0
  218. {tactus-0.32.1 → tactus-0.33.0}/tactus/backends/pytorch_backend.py +0 -0
  219. {tactus-0.32.1 → tactus-0.33.0}/tactus/broker/__init__.py +0 -0
  220. {tactus-0.32.1 → tactus-0.33.0}/tactus/broker/client.py +0 -0
  221. {tactus-0.32.1 → tactus-0.33.0}/tactus/broker/protocol.py +0 -0
  222. {tactus-0.32.1 → tactus-0.33.0}/tactus/broker/server.py +0 -0
  223. {tactus-0.32.1 → tactus-0.33.0}/tactus/broker/stdio.py +0 -0
  224. {tactus-0.32.1 → tactus-0.33.0}/tactus/cli/__init__.py +0 -0
  225. {tactus-0.32.1 → tactus-0.33.0}/tactus/cli/app.py +0 -0
  226. {tactus-0.32.1 → tactus-0.33.0}/tactus/cli/commands/__init__.py +0 -0
  227. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/__init__.py +0 -0
  228. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/config_manager.py +0 -0
  229. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/dependencies/__init__.py +0 -0
  230. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/dependencies/registry.py +0 -0
  231. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/dsl_stubs.py +0 -0
  232. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/exceptions.py +0 -0
  233. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/execution_context.py +0 -0
  234. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/lua_sandbox.py +0 -0
  235. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/message_history_manager.py +0 -0
  236. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/mocking.py +0 -0
  237. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/output_validator.py +0 -0
  238. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/registry.py +0 -0
  239. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/runtime.py +0 -0
  240. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/template_resolver.py +0 -0
  241. {tactus-0.32.1 → tactus-0.33.0}/tactus/core/yaml_parser.py +0 -0
  242. {tactus-0.32.1 → tactus-0.33.0}/tactus/docker/Dockerfile +0 -0
  243. {tactus-0.32.1 → tactus-0.33.0}/tactus/docker/entrypoint.sh +0 -0
  244. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/__init__.py +0 -0
  245. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/agent.py +0 -0
  246. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/broker_lm.py +0 -0
  247. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/config.py +0 -0
  248. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/history.py +0 -0
  249. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/module.py +0 -0
  250. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/prediction.py +0 -0
  251. {tactus-0.32.1 → tactus-0.33.0}/tactus/dspy/signature.py +0 -0
  252. {tactus-0.32.1 → tactus-0.33.0}/tactus/formatting/__init__.py +0 -0
  253. {tactus-0.32.1 → tactus-0.33.0}/tactus/formatting/formatter.py +0 -0
  254. {tactus-0.32.1 → tactus-0.33.0}/tactus/ide/__init__.py +0 -0
  255. {tactus-0.32.1 → tactus-0.33.0}/tactus/ide/coding_assistant.py +0 -0
  256. {tactus-0.32.1 → tactus-0.33.0}/tactus/ide/config_server.py +0 -0
  257. {tactus-0.32.1 → tactus-0.33.0}/tactus/ide/server.py +0 -0
  258. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/__init__.py +0 -0
  259. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/control.py +0 -0
  260. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/file.py +0 -0
  261. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/handles.py +0 -0
  262. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/host.py +0 -0
  263. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/human.py +0 -0
  264. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/json.py +0 -0
  265. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/log.py +0 -0
  266. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/message_history.py +0 -0
  267. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/model.py +0 -0
  268. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/procedure.py +0 -0
  269. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/procedure_callable.py +0 -0
  270. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/retry.py +0 -0
  271. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/session.py +0 -0
  272. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/state.py +0 -0
  273. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/step.py +0 -0
  274. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/system.py +0 -0
  275. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/tool.py +0 -0
  276. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/tool_handle.py +0 -0
  277. {tactus-0.32.1 → tactus-0.33.0}/tactus/primitives/toolset.py +0 -0
  278. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/__init__.py +0 -0
  279. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/chat_recorder.py +0 -0
  280. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/config.py +0 -0
  281. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/cost.py +0 -0
  282. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/hitl.py +0 -0
  283. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/log_handler.py +0 -0
  284. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/models.py +0 -0
  285. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/result.py +0 -0
  286. {tactus-0.32.1 → tactus-0.33.0}/tactus/protocols/storage.py +0 -0
  287. {tactus-0.32.1 → tactus-0.33.0}/tactus/providers/__init__.py +0 -0
  288. {tactus-0.32.1 → tactus-0.33.0}/tactus/providers/base.py +0 -0
  289. {tactus-0.32.1 → tactus-0.33.0}/tactus/providers/bedrock.py +0 -0
  290. {tactus-0.32.1 → tactus-0.33.0}/tactus/providers/google.py +0 -0
  291. {tactus-0.32.1 → tactus-0.33.0}/tactus/providers/openai.py +0 -0
  292. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/__init__.py +0 -0
  293. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/config.py +0 -0
  294. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/container_runner.py +0 -0
  295. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/docker_manager.py +0 -0
  296. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/entrypoint.py +0 -0
  297. {tactus-0.32.1 → tactus-0.33.0}/tactus/sandbox/protocol.py +0 -0
  298. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/__init__.py +0 -0
  299. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/__init__.py +0 -0
  300. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/csv.py +0 -0
  301. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/excel.py +0 -0
  302. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/file.py +0 -0
  303. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/fs.py +0 -0
  304. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/hdf5.py +0 -0
  305. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/json.py +0 -0
  306. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/parquet.py +0 -0
  307. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/io/tsv.py +0 -0
  308. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/loader.py +0 -0
  309. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
  310. {tactus-0.32.1 → tactus-0.33.0}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
  311. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/README.md +0 -0
  312. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/__init__.py +0 -0
  313. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/behave_integration.py +0 -0
  314. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/context.py +0 -0
  315. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/eval_models.py +0 -0
  316. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/evaluation_runner.py +0 -0
  317. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/evaluators.py +0 -0
  318. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/events.py +0 -0
  319. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/gherkin_parser.py +0 -0
  320. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/mock_agent.py +0 -0
  321. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/mock_dependencies.py +0 -0
  322. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/mock_hitl.py +0 -0
  323. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/mock_registry.py +0 -0
  324. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/mock_tools.py +0 -0
  325. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/models.py +0 -0
  326. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/pydantic_eval_runner.py +0 -0
  327. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/steps/__init__.py +0 -0
  328. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/steps/builtin.py +0 -0
  329. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/steps/custom.py +0 -0
  330. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/steps/registry.py +0 -0
  331. {tactus-0.32.1 → tactus-0.33.0}/tactus/testing/test_runner.py +0 -0
  332. {tactus-0.32.1 → tactus-0.33.0}/tactus/tracing/__init__.py +0 -0
  333. {tactus-0.32.1 → tactus-0.33.0}/tactus/tracing/trace_manager.py +0 -0
  334. {tactus-0.32.1 → tactus-0.33.0}/tactus/utils/__init__.py +0 -0
  335. {tactus-0.32.1 → tactus-0.33.0}/tactus/utils/cost_calculator.py +0 -0
  336. {tactus-0.32.1 → tactus-0.33.0}/tactus/utils/model_pricing.py +0 -0
  337. {tactus-0.32.1 → tactus-0.33.0}/tactus/utils/safe_file_library.py +0 -0
  338. {tactus-0.32.1 → tactus-0.33.0}/tactus/utils/safe_libraries.py +0 -0
  339. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/LuaLexerBase.py +0 -0
  340. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/LuaParserBase.py +0 -0
  341. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/README.md +0 -0
  342. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/__init__.py +0 -0
  343. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/error_listener.py +0 -0
  344. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaLexer.interp +0 -0
  345. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaLexer.py +0 -0
  346. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
  347. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
  348. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaParser.interp +0 -0
  349. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaParser.py +0 -0
  350. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaParser.tokens +0 -0
  351. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaParserBase.py +0 -0
  352. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  353. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/generated/__init__.py +0 -0
  354. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  355. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
  356. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/semantic_visitor.py +0 -0
  357. {tactus-0.32.1 → tactus-0.33.0}/tactus/validation/validator.py +0 -0
  358. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/.gitignore +0 -0
  359. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/BUILD_GUIDE.md +0 -0
  360. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
  361. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
  362. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  363. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/backend/hook-lupa.py +0 -0
  364. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
  365. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/package-lock.json +0 -0
  366. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/preload/preload.ts +0 -0
  367. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/preload/tsconfig.json +0 -0
  368. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/rebuild-and-test.sh +0 -0
  369. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/resources/app-icon.icns +0 -0
  370. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/resources/app-icon.ico +0 -0
  371. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/resources/app-icon.png +0 -0
  372. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/scripts/build-backend.mjs +0 -0
  373. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/scripts/build-frontend.mjs +0 -0
  374. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
  375. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/src/backend-manager.ts +0 -0
  376. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/src/main.ts +0 -0
  377. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/src/menu.ts +0 -0
  378. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/src/preferences-window.ts +0 -0
  379. {tactus-0.32.1 → tactus-0.33.0}/tactus-desktop/tsconfig.json +0 -0
  380. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/ARCHITECTURE.md +0 -0
  381. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/CHANGELOG.md +0 -0
  382. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/DEV_MODE.md +0 -0
  383. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/QUICK_START.md +0 -0
  384. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/README.md +0 -0
  385. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  386. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
  387. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/README.md +0 -0
  388. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/assistant_service.py +0 -0
  389. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/assistant_tools.py +0 -0
  390. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/chat_server.py +0 -0
  391. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/config_server.py +0 -0
  392. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/events.py +0 -0
  393. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/logging_capture.py +0 -0
  394. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/lsp_server.py +0 -0
  395. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/requirements.txt +0 -0
  396. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  397. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/test_lsp_server.py +0 -0
  398. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/backend/text_editor_tool.py +0 -0
  399. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/dev.sh +0 -0
  400. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
  401. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  402. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  403. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/README.md +0 -0
  404. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/demo.ts +0 -0
  405. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/index.html +0 -0
  406. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/jest.config.js +0 -0
  407. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/package-lock.json +0 -0
  408. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/package.json +0 -0
  409. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/postcss.config.js +0 -0
  410. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/App.tsx +0 -0
  411. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
  412. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  413. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  414. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  415. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  416. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
  417. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/AuthErrorDialog.tsx +0 -0
  418. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
  419. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  420. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  421. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  422. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  423. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  424. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  425. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
  426. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
  427. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  428. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  429. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  430. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  431. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  432. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  433. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  434. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  435. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
  436. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
  437. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  438. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  439. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  440. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
  441. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
  442. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
  443. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  444. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  445. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  446. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  447. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  448. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  449. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  450. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  451. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  452. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  453. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  454. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  455. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
  456. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
  457. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
  458. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  459. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
  460. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  461. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  462. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
  463. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  464. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  465. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  466. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  467. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  468. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
  469. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  470. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  471. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  472. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  473. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  474. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  475. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  476. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
  477. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  478. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  479. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  480. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  481. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  482. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  483. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  484. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  485. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  486. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  487. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  488. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
  489. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
  490. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
  491. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  492. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  493. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  494. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  495. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  496. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  497. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  498. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  499. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
  500. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  501. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  502. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  503. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  504. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
  505. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  506. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  507. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  508. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  509. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
  510. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  511. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
  512. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  513. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
  514. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
  515. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
  516. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  517. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/index.css +0 -0
  518. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  519. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/main.tsx +0 -0
  520. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/types/events.ts +0 -0
  521. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  522. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
  523. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/types/results.ts +0 -0
  524. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  525. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
  526. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  527. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  528. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  529. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
  530. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  531. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/tailwind.config.js +0 -0
  532. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/tsconfig.json +0 -0
  533. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
  534. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/vite.config.ts +0 -0
  535. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  536. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/package.json +0 -0
  537. {tactus-0.32.1 → tactus-0.33.0}/tactus-ide/start-dev.sh +0 -0
  538. {tactus-0.32.1 → tactus-0.33.0}/test-ci.sh +0 -0
  539. {tactus-0.32.1 → tactus-0.33.0}/tests/__init__.py +0 -0
  540. {tactus-0.32.1 → tactus-0.33.0}/tests/adapters/__init__.py +0 -0
  541. {tactus-0.32.1 → tactus-0.33.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
  542. {tactus-0.32.1 → tactus-0.33.0}/tests/adapters/test_plugins.py +0 -0
  543. {tactus-0.32.1 → tactus-0.33.0}/tests/broker/test_broker_host_tool_source.py +0 -0
  544. {tactus-0.32.1 → tactus-0.33.0}/tests/broker/test_broker_integration.py +0 -0
  545. {tactus-0.32.1 → tactus-0.33.0}/tests/broker/test_broker_tcp_integration.py +0 -0
  546. {tactus-0.32.1 → tactus-0.33.0}/tests/broker/test_broker_tcp_unit.py +0 -0
  547. {tactus-0.32.1 → tactus-0.33.0}/tests/broker/test_brokered_lm_unit.py +0 -0
  548. {tactus-0.32.1 → tactus-0.33.0}/tests/cli/__init__.py +0 -0
  549. {tactus-0.32.1 → tactus-0.33.0}/tests/cli/test_cli.py +0 -0
  550. {tactus-0.32.1 → tactus-0.33.0}/tests/cli/test_cli_inputs.py +0 -0
  551. {tactus-0.32.1 → tactus-0.33.0}/tests/conftest.py +0 -0
  552. {tactus-0.32.1 → tactus-0.33.0}/tests/core/__init__.py +0 -0
  553. {tactus-0.32.1 → tactus-0.33.0}/tests/core/test_config_manager.py +0 -0
  554. {tactus-0.32.1 → tactus-0.33.0}/tests/core/test_determinism_safety.py +0 -0
  555. {tactus-0.32.1 → tactus-0.33.0}/tests/core/test_lua_sandbox_security.py +0 -0
  556. {tactus-0.32.1 → tactus-0.33.0}/tests/core/test_runtime_inputs.py +0 -0
  557. {tactus-0.32.1 → tactus-0.33.0}/tests/core/test_script_mode.py +0 -0
  558. {tactus-0.32.1 → tactus-0.33.0}/tests/dspy/__init__.py +0 -0
  559. {tactus-0.32.1 → tactus-0.33.0}/tests/dspy/test_mock_field_normalization.py +0 -0
  560. {tactus-0.32.1 → tactus-0.33.0}/tests/dspy/test_module_parameter.py +0 -0
  561. {tactus-0.32.1 → tactus-0.33.0}/tests/dspy/test_prediction_messages.py +0 -0
  562. {tactus-0.32.1 → tactus-0.33.0}/tests/dspy/test_streaming.py +0 -0
  563. {tactus-0.32.1 → tactus-0.33.0}/tests/fixtures/__init__.py +0 -0
  564. {tactus-0.32.1 → tactus-0.33.0}/tests/fixtures/brave_search_mcp_server.py +0 -0
  565. {tactus-0.32.1 → tactus-0.33.0}/tests/fixtures/filesystem_mcp_server.py +0 -0
  566. {tactus-0.32.1 → tactus-0.33.0}/tests/fixtures/test_mcp_server.py +0 -0
  567. {tactus-0.32.1 → tactus-0.33.0}/tests/integration/test_named_procedures.py +0 -0
  568. {tactus-0.32.1 → tactus-0.33.0}/tests/mocks/__init__.py +0 -0
  569. {tactus-0.32.1 → tactus-0.33.0}/tests/mocks/llm_mocks.py +0 -0
  570. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
  571. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_host_primitive.py +0 -0
  572. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_retry_primitive.py +0 -0
  573. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_state_primitive.py +0 -0
  574. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_system_alert.py +0 -0
  575. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_tool_primitive.py +0 -0
  576. {tactus-0.32.1 → tactus-0.33.0}/tests/primitives/test_toolset_dsl.py +0 -0
  577. {tactus-0.32.1 → tactus-0.33.0}/tests/sandbox/test_container_runner.py +0 -0
  578. {tactus-0.32.1 → tactus-0.33.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
  579. {tactus-0.32.1 → tactus-0.33.0}/tests/stdlib/__init__.py +0 -0
  580. {tactus-0.32.1 → tactus-0.33.0}/tests/stdlib/test_loader.py +0 -0
  581. {tactus-0.32.1 → tactus-0.33.0}/tests/stdlib/test_require_python.py +0 -0
  582. {tactus-0.32.1 → tactus-0.33.0}/tests/test_checkpoints_integration.py +0 -0
  583. {tactus-0.32.1 → tactus-0.33.0}/tests/test_formatter.py +0 -0
  584. {tactus-0.32.1 → tactus-0.33.0}/tests/test_mcp_integration.py +0 -0
  585. {tactus-0.32.1 → tactus-0.33.0}/tests/test_tracing.py +0 -0
  586. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/__init__.py +0 -0
  587. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/conftest.py +0 -0
  588. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_all_examples.py +0 -0
  589. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_e2e.py +0 -0
  590. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_gherkin_parser.py +0 -0
  591. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_integration.py +0 -0
  592. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_models.py +0 -0
  593. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_runtime_integration.py +0 -0
  594. {tactus-0.32.1 → tactus-0.33.0}/tests/testing/test_step_registry.py +0 -0
  595. {tactus-0.32.1 → tactus-0.33.0}/tests/utils/__init__.py +0 -0
  596. {tactus-0.32.1 → tactus-0.33.0}/tests/utils/test_safe_file_library.py +0 -0
  597. {tactus-0.32.1 → tactus-0.33.0}/tests/validation/__init__.py +0 -0
  598. {tactus-0.32.1 → tactus-0.33.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Set up Python
26
26
  uses: actions/setup-python@v5
27
27
  with:
28
- python-version: '3.11'
28
+ python-version: '3.13'
29
29
  cache: 'pip'
30
30
 
31
31
  - name: Install dependencies
@@ -64,7 +64,7 @@ jobs:
64
64
  - name: Set up Python
65
65
  uses: actions/setup-python@v5
66
66
  with:
67
- python-version: '3.11'
67
+ python-version: '3.13'
68
68
  cache: 'pip'
69
69
 
70
70
  - name: Install python-semantic-release
@@ -115,7 +115,7 @@ jobs:
115
115
  - name: Setup Python
116
116
  uses: actions/setup-python@v5
117
117
  with:
118
- python-version: '3.11'
118
+ python-version: '3.13'
119
119
 
120
120
  - name: Install Python dependencies
121
121
  run: |
@@ -2,6 +2,27 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.33.0 (2026-01-18)
6
+
7
+ ### Documentation
8
+
9
+ - Add installation instructions for unsigned macOS builds
10
+ ([`bb34f44`](https://github.com/AnthusAI/Tactus/commit/bb34f44b389b0154801d79a9d23255068328945d))
11
+
12
+ ### Features
13
+
14
+ - Improve unsigned app distribution based on research
15
+ ([`34bc90e`](https://github.com/AnthusAI/Tactus/commit/34bc90ed6e25f4e58a4fefccbbc3c4220869dd3b))
16
+
17
+
18
+ ## v0.32.2 (2026-01-17)
19
+
20
+ ### Bug Fixes
21
+
22
+ - Use Python 3.13 in CI to match local working build
23
+ ([`e2d2768`](https://github.com/AnthusAI/Tactus/commit/e2d276819759b7c8feb724f42145ab8553025b78))
24
+
25
+
5
26
  ## v0.32.1 (2026-01-17)
6
27
 
7
28
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.32.1
3
+ Version: 0.33.0
4
4
  Summary: Tactus: Lua-based DSL for agentic workflows
5
5
  Project-URL: Homepage, https://github.com/AnthusAI/Tactus
6
6
  Project-URL: Documentation, https://github.com/AnthusAI/Tactus/tree/main/docs
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tactus"
7
- version = "0.32.1"
7
+ version = "0.33.0"
8
8
  description = "Tactus: Lua-based DSL for agentic workflows"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,7 +5,7 @@ Tactus provides a declarative workflow engine for AI agents with pluggable
5
5
  backends for storage, HITL, and chat recording.
6
6
  """
7
7
 
8
- __version__ = "0.32.1"
8
+ __version__ = "0.33.0"
9
9
 
10
10
  # Core exports
11
11
  from tactus.core.runtime import TactusRuntime
@@ -0,0 +1,205 @@
1
+ # Distribution Notes for Unsigned Electron Apps
2
+
3
+ ## Current Working Solution (v0.32.2+)
4
+
5
+ The GitHub Actions build **DOES work** - users just need to remove quarantine attributes:
6
+
7
+ ```bash
8
+ # Required steps for macOS users:
9
+ xattr -cr ~/Downloads/Tactus*.dmg
10
+ open ~/Downloads/Tactus*.dmg
11
+ xattr -cr "/Applications/Tactus IDE.app"
12
+ ```
13
+
14
+ **Verified working:** v0.32.2 DMG launches successfully after removing quarantine.
15
+
16
+ ## The Problem
17
+
18
+ When users download the DMG from GitHub Releases:
19
+ 1. GitHub adds `com.apple.provenance` attribute to downloaded files
20
+ 2. macOS Gatekeeper sees the app isn't code-signed
21
+ 3. macOS blocks the app with "damaged" error message
22
+ 4. Even right-clicking and selecting "Open" doesn't work for unsigned DMGs from the internet
23
+
24
+ ## Why Local Builds Work
25
+
26
+ Local builds don't have quarantine attributes because they weren't downloaded from the internet. That's why testing locally always worked but CI builds appeared broken.
27
+
28
+ ## Alternative Distribution Methods (RESEARCHED)
29
+
30
+ ### 1. **Homebrew Cask - BEST SOLUTION**
31
+ **Most popular method for unsigned Electron apps. Homebrew handles quarantine automatically.**
32
+
33
+ Used by: VSCodium, Motrix, MarkText, Kap, FreeTube, PicGo, YesPlayMusic, and many others.
34
+
35
+ **Advantages:**
36
+ - ✅ No manual quarantine removal needed
37
+ - ✅ Automatic updates through Homebrew
38
+ - ✅ Trusted by developer community
39
+ - ✅ No code signing required
40
+ - ✅ Users already familiar with `brew install`
41
+
42
+ **How to Submit:**
43
+ 1. Create a Cask formula in homebrew/homebrew-cask repository
44
+ 2. Formula references the DMG from GitHub Releases
45
+ 3. Homebrew team reviews and merges
46
+ 4. Users install with: `brew install --cask tactus-ide`
47
+
48
+ **Example Apps Successfully Using This:**
49
+ - VSCodium (VSCode fork): https://github.com/VSCodium/vscodium
50
+ - Motrix (download manager): https://github.com/agalwood/Motrix
51
+ - MarkText (markdown editor): https://github.com/marktext/marktext
52
+
53
+ ### 2. **Provide Both DMG and ZIP**
54
+ Research shows successful apps offer both formats:
55
+ - **DMG**: More professional, better UX, drag-to-install
56
+ - **ZIP**: Simpler, some users report fewer issues
57
+ - Both still trigger quarantine, but choice is good UX
58
+
59
+ **Examples:**
60
+ - draw.io desktop offers both
61
+ - VSCodium provides both formats
62
+
63
+ ### 2. **Self-Hosted Downloads with Instructions**
64
+ Host the DMG on your own server with clear installation instructions:
65
+ - Removes GitHub's automatic quarantine flags
66
+ - More control over download experience
67
+ - Can show installation instructions before download
68
+
69
+ ### 3. **Real-World Examples of Unsigned Distribution**
70
+
71
+ **massCode** (most transparent example):
72
+ - Repository: https://github.com/massCodeIO/massCode
73
+ - Explicitly ships unsigned starting v3.8.0 (dev couldn't afford Apple cert)
74
+ - Documents three workarounds in README
75
+ - Discussion: https://github.com/massCodeIO/massCode/discussions/413
76
+
77
+ **YouTube Music (th-ch/youtube-music)**:
78
+ - electron-builder config uses `identity: null` to explicitly disable signing
79
+ - Ships DMG for both x64 and arm64
80
+ - Config: https://github.com/th-ch/youtube-music/blob/master/electron-builder.yml
81
+
82
+ **MarkText**:
83
+ - Repository: https://github.com/marktext/marktext
84
+ - Multiple issues (#3889, #3004, #2983) document user workarounds
85
+ - Users share solution: `xattr -dr com.apple.quarantine /Applications/MarkText.app/`
86
+
87
+ ### 4. **Notarization Service Alternatives**
88
+ Some third-party services offer notarization for a fee (cheaper than $99/year):
89
+ - Research if any legitimate services exist
90
+ - Would provide proper macOS integration
91
+ - Probably not worth it for MVP
92
+
93
+ ### 5. **Homebrew Cask Distribution**
94
+ Distribute via Homebrew:
95
+ ```bash
96
+ brew install --cask tactus-ide
97
+ ```
98
+ - Homebrew handles installation and quarantine removal
99
+ - Users familiar with dev tools already use Homebrew
100
+ - Requires maintaining a Cask formula
101
+
102
+ ### 6. **electron-builder Auto-Update**
103
+ Built-in update mechanism that bypasses Gatekeeper:
104
+ - After first install (with xattr), updates work seamlessly
105
+ - electron-updater package handles this
106
+ - Requires hosting update server
107
+
108
+ ## Research TODO
109
+
110
+ - [ ] Test ZIP distribution vs DMG (does it actually help?)
111
+ - [ ] Test ad-hoc code signing (does it reduce errors?)
112
+ - [ ] Research how other unsigned Electron apps distribute (VSCode forks, etc.)
113
+ - [ ] Look into Homebrew Cask as primary distribution method
114
+ - [ ] Check if electron-builder has any built-in solutions
115
+ - [ ] Research user experience: how do other indie Electron apps handle this?
116
+
117
+ ## Key Insight from Debugging
118
+
119
+ **The app itself is perfectly fine.** The binaries are identical between local and CI builds. The only issue is macOS quarantine attributes added during download from GitHub. This is a distribution problem, not a build problem.
120
+
121
+ ## Projects to Study
122
+
123
+ Look at how these unsigned/indie Electron apps handle distribution:
124
+ - Obsidian (before they got signing)
125
+ - Various open-source Electron apps on GitHub
126
+ - Community forks of popular apps
127
+ - Apps distributed via GitHub Releases without signing
128
+
129
+ ## Cost-Benefit Analysis
130
+
131
+ **Code Signing ($99/year):**
132
+ - ✅ Zero friction for users
133
+ - ✅ Professional appearance
134
+ - ✅ App Store distribution possible
135
+ - ❌ $99/year recurring cost
136
+ - ❌ Requires maintaining Apple Developer account
137
+
138
+ **Current Solution (xattr commands):**
139
+ - ✅ Free
140
+ - ✅ Works perfectly once configured
141
+ - ❌ Extra steps for users
142
+ - ❌ Looks less professional
143
+ - ✅ Fine for developer/power user audience
144
+
145
+ For an IDE targeting developers, the current solution may be acceptable since the target audience is comfortable with terminal commands.
146
+
147
+ ## Recommended Configuration
148
+
149
+ Based on research of successful unsigned Electron apps, here's the optimal electron-builder configuration:
150
+
151
+ ```json
152
+ {
153
+ "mac": {
154
+ "target": [
155
+ {
156
+ "target": "dmg",
157
+ "arch": ["x64", "arm64"]
158
+ },
159
+ {
160
+ "target": "zip",
161
+ "arch": ["x64", "arm64"]
162
+ }
163
+ ],
164
+ "identity": null,
165
+ "hardenedRuntime": false,
166
+ "gatekeeperAssess": false,
167
+ "category": "public.app-category.developer-tools"
168
+ }
169
+ }
170
+ ```
171
+
172
+ **Key settings for unsigned builds:**
173
+ - `identity: null` - Explicitly disables code signing (recommended by electron-builder maintainers)
174
+ - `hardenedRuntime: false` - Not needed without signing
175
+ - `gatekeeperAssess: false` - Already set in our config
176
+ - Provide both DMG and ZIP - Users can choose which works better
177
+
178
+ ## Immediate Action Items
179
+
180
+ 1. **Update electron-builder config** to add `identity: null` and ZIP target
181
+ 2. **Submit to Homebrew Cask** - This is the PRIMARY recommended distribution method
182
+ 3. **Update README** with System Settings method (Option 1) as the easiest solution
183
+ 4. **Test both DMG and ZIP** to see if either has fewer issues
184
+
185
+ ## Homebrew Cask Submission
186
+
187
+ Priority: HIGH - This solves the distribution problem for macOS users.
188
+
189
+ **Steps:**
190
+ 1. Ensure releases have stable URLs (already done via GitHub Releases)
191
+ 2. Create Cask formula in homebrew/homebrew-cask
192
+ 3. Formula example:
193
+ ```ruby
194
+ cask "tactus-ide" do
195
+ version "0.32.2"
196
+ sha256 "..." # calculate with: shasum -a 256 Tactus*.dmg
197
+
198
+ url "https://github.com/AnthusAI/Tactus/releases/download/v#{version}/Tactus.IDE-#{version}-mac.dmg"
199
+ name "Tactus IDE"
200
+ desc "IDE for Tactus workflow automation"
201
+ homepage "https://github.com/AnthusAI/Tactus"
202
+
203
+ app "Tactus IDE.app"
204
+ end
205
+ ```
@@ -56,13 +56,49 @@ python3 --version # Should show 3.11 or higher
56
56
  - Windows: `dist-electron/Tactus-IDE-Setup-{version}.exe`
57
57
  - Linux: `dist-electron/Tactus-IDE-{version}-{arch}.AppImage`
58
58
 
59
- ## Unsigned Builds
59
+ ## Installing Unsigned Builds
60
60
 
61
- This MVP does not include code signing. Users will see security warnings:
61
+ This application is not code-signed (requires $99/year Apple Developer Program). Users need to remove macOS quarantine attributes after downloading.
62
62
 
63
- - **macOS**: Right-click > Open (bypass "unidentified developer")
64
- - **Windows**: "More info" > "Run anyway" (SmartScreen warning)
65
- - **Linux**: No issues with unsigned binaries
63
+ ### macOS Installation
64
+
65
+ **Option 1: Install via Homebrew (Recommended)**
66
+ ```bash
67
+ # Coming soon - Homebrew Cask handles quarantine automatically
68
+ brew install --cask tactus-ide
69
+ ```
70
+
71
+ **Option 2: System Settings Method (Easiest for Direct Downloads)**
72
+
73
+ If you see "app is damaged" error after downloading:
74
+
75
+ 1. Try to open the app (it will be blocked)
76
+ 2. Go to **System Settings → Privacy & Security**
77
+ 3. Scroll down and click **"Open Anyway"** button
78
+ 4. Click **"Open"** when the confirmation appears
79
+
80
+ This is Apple's official method for opening unsigned apps. More info: https://support.apple.com/en-us/102445
81
+
82
+ **Option 3: Terminal Command (Advanced Users)**
83
+ ```bash
84
+ # Remove quarantine from the DMG first
85
+ xattr -cr ~/Downloads/Tactus*.dmg
86
+
87
+ # Open DMG, drag to Applications, then remove quarantine from app
88
+ xattr -cr "/Applications/Tactus IDE.app"
89
+ ```
90
+
91
+ **Why this is needed:** macOS Gatekeeper blocks downloaded apps that aren't code-signed with an Apple Developer certificate ($99/year). Despite the "damaged" message, the app is fine - it's a security warning, not actual corruption.
92
+
93
+ ### Windows Installation
94
+
95
+ - Click "More info" > "Run anyway" when SmartScreen warning appears
96
+ - No additional steps needed after that
97
+
98
+ ### Linux Installation
99
+
100
+ - No issues with unsigned binaries
101
+ - Make AppImage executable: `chmod +x Tactus*.AppImage`
66
102
 
67
103
  ## Project Structure
68
104
 
@@ -57,9 +57,11 @@
57
57
  "category": "public.app-category.developer-tools",
58
58
  "icon": "resources/app-icon.icns",
59
59
  "target": [
60
- "dmg"
60
+ "dmg",
61
+ "zip"
61
62
  ],
62
63
  "artifactName": "${productName}-${version}-${os}.${ext}",
64
+ "identity": null,
63
65
  "hardenedRuntime": false,
64
66
  "gatekeeperAssess": false
65
67
  },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes