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.
- tactus-0.29.1/.github/workflows/release.yml +177 -0
- {tactus-0.28.0 → tactus-0.29.1}/AGENTS.md +57 -0
- {tactus-0.28.0 → tactus-0.29.1}/CHANGELOG.md +21 -0
- {tactus-0.28.0 → tactus-0.29.1}/PKG-INFO +1 -1
- tactus-0.29.1/docs/development-mode.md +128 -0
- {tactus-0.28.0 → tactus-0.29.1}/pyproject.toml +1 -1
- {tactus-0.28.0 → tactus-0.29.1}/tactus/__init__.py +1 -1
- {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/server.py +2 -1
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/config.py +6 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/container_runner.py +49 -0
- tactus-0.29.1/tactus-desktop/BUILD_GUIDE.md +213 -0
- tactus-0.29.1/tactus-desktop/ELECTRON_INTEGRATION.md +206 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/backend/tactus_backend.spec +6 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/package.json +1 -0
- tactus-0.29.1/tactus-desktop/resources/app-icon.icns +0 -0
- tactus-0.29.1/tactus-desktop/resources/app-icon.ico +0 -0
- tactus-0.29.1/tactus-desktop/resources/app-icon.png +0 -0
- tactus-0.29.1/tactus-desktop/scripts/generate-icons.sh +95 -0
- tactus-0.29.1/tactus-ide/frontend/src/components/ui/logo.tsx +22 -0
- tactus-0.28.0/.github/workflows/desktop-release.yml +0 -83
- tactus-0.28.0/.github/workflows/release.yml +0 -92
- tactus-0.28.0/tactus-ide/frontend/src/components/ui/logo.tsx +0 -579
- {tactus-0.28.0 → tactus-0.29.1}/.claude/agents.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/.gitignore +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/.tactus/config.yml.example +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/IMPLEMENTATION.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/LICENSE +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/Makefile +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/SPECIFICATION.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/TECHNICAL_DEBT.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/behave.ini +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/AGENTS.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/BDD_TESTING.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/CONFIGURATION.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/DURABILITY.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/FILE_IO.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/SANDBOXING.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/STREAMING.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/TOOLS.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/docs/TOOL_ROADMAP.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/.tactus/config.yml +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/01-basics-hello-world.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/02-basics-simple-logic.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/04-basics-simple-agent.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/05-basics-multi-model.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/06-basics-streaming.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/07-basics-bedrock.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/08-basics-models.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/09-basics-google-gemini.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/10-feature-state.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/11-feature-message-history.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/12-feature-structured-output.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/13-feature-session.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/14-feature-per-turn-tools.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/15-feature-local-tools.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/16-feature-toolsets-advanced.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/17-feature-toolsets-dsl.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-individual.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-inline.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/18-feature-lua-tools-toolset.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/19-feature-direct-tool-calls.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/20-bdd-complete.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/20-bdd-complete.tac.bak2 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/21-bdd-passing.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/21-bdd-passing.tac.bak2 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/30-eval-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/31-eval-demo.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/32-eval-success-rate.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/33-eval-thresholds.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/34-eval-dataset.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/35-eval-trace.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/35-eval-trace.tac.bak2 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/36-eval-advanced.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/37-eval-comprehensive.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/39-model-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/40-mcp-test.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/40-model-text-classifier.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/41-model-pytorch.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/44-sub-procedure-composition.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/52-file-io-basics.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/53-tsv-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/54-json-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/55-parquet-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/56-hdf5-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/57-excel-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/58-text-file-io.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/60-tool-sources.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/61-inline-toolset-lua.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/62-mcp-toolset-by-server.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/63-toolset-import-from-file.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/64-require-modules.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/65-optional-state-demo.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/66-host-tools-via-broker.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/67-host-tool-source.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/70-mocking-static.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/71-mocking-temporal.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/72-mocking-conditional.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/99-misc-test-loading.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/app_config.ini +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/data/sample.csv +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/demo_output.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/math_module.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/product.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/string_module.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/sum.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/inventory_summary.tsv +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/mock-config.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/models/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/output_summary.txt +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/test-raw-module.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/test-raw-streaming.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/tools/calculations.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/tools/data_analysis.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/tools/search.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/01_state_management.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/02_checkpointing.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/04_control_flow.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/05_tool_integration.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/06_retry_logic.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/07_file_operations.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/08_agent_primitives.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/09_workflow_execution.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/10_lua_integration.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/11_storage_backends.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/12_json_operations.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/13_logging.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/14_stage_and_step_tracking.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/15_procedure_calls.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/16_session_management.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/18_example_procedures.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/19_ide_server.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/20_parameters.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/21_outputs.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/23_prompts.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/27_default_settings.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/28_custom_prompts.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/29_execution_settings.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/30_session_filters.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/31_matchers.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/32_result_object.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/33_output_type.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/42_model_primitive.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/48_script_mode.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/52_dspy_signature.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/53_dspy_module.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/54_dspy_history.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/56_dspy_agent.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/57_chat_assistant.feature +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/environment.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/chat_assistant_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/example_procedures_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/logging_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/mocking_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/result_and_output_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/session_management_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/stage_tracking_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/state_management_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/support/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/support/harnesses.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/scripts/convert_examples.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/start-web-ide.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/broker_log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cli_log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/cost_collector_log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/mcp.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/memory.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/adapters/plugins.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/http_backend.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/model_backend.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/client.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/protocol.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/broker/stdio.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/app.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/config_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/dsl_stubs.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/exceptions.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/execution_context.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/mocking.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/output_validator.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/registry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/runtime.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/template_resolver.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/docker/Dockerfile +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/agent.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/broker_lm.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/config.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/history.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/module.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/prediction.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/dspy/signature.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/ide/coding_assistant.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/control.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/file.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/handles.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/host.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/human.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/json.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/log.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/message_history.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/model.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/procedure.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/retry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/session.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/stage.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/state.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/step.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/system.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/tool.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/primitives/toolset.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/config.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/cost.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/hitl.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/log_handler.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/models.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/result.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/protocols/storage.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/base.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/bedrock.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/google.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/providers/openai.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/docker_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/entrypoint.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/sandbox/protocol.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/fs.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/loader.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/behave_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/context.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/eval_models.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/evaluators.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/events.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_agent.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/mock_tools.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/models.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/builtin.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/testing/test_runner.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/tracing/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/error_listener.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/semantic_visitor.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus/validation/validator.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/.gitignore +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/assistant_service.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/assistant_tools.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/chat_server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/config_server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/events.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/backend/text_editor_tool.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/dev.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/package-lock.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/App.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +1 -1
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/events.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/preferences.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/package.json +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/test-ci.sh +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_host_tool_source.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_tcp_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_broker_tcp_unit.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/broker/test_brokered_lm_unit.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/cli/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/cli/test_cli.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/conftest.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_config_manager.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/core/test_script_mode.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_mock_field_normalization.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_module_parameter.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_prediction_messages.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/fixtures/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/mocks/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_checkpoint_primitive.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_host_primitive.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_system_alert.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/sandbox/test_container_runner.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/test_mcp_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/test_tracing.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/conftest.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_all_examples.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_e2e.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_models.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/utils/__init__.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.28.0 → tactus-0.29.1}/tests/validation/__init__.py +0 -0
- {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
|
|
@@ -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
|
|
@@ -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
|
-
|
|
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)])
|