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