tactus 0.29.4__tar.gz → 0.31.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.29.4 → tactus-0.31.0}/AGENTS.md +4 -0
- {tactus-0.29.4 → tactus-0.31.0}/CHANGELOG.md +16 -0
- {tactus-0.29.4 → tactus-0.31.0}/IMPLEMENTATION.md +0 -24
- {tactus-0.29.4 → tactus-0.31.0}/PKG-INFO +17 -11
- {tactus-0.29.4 → tactus-0.31.0}/README.md +16 -10
- {tactus-0.29.4 → tactus-0.31.0}/SPECIFICATION.md +28 -133
- tactus-0.31.0/TECHNICAL_DEBT.md +156 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/BDD_TESTING.md +28 -33
- {tactus-0.29.4 → tactus-0.31.0}/docs/DURABILITY.md +3 -3
- {tactus-0.29.4 → tactus-0.31.0}/docs/TOOLS.md +8 -7
- {tactus-0.29.4 → tactus-0.31.0}/docs/TOOL_ROADMAP.md +6 -6
- {tactus-0.29.4 → tactus-0.31.0}/examples/.tactus/config.yml +6 -6
- tactus-0.31.0/examples/01-basics-hello-world.tac +18 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/02-basics-simple-logic.tac +13 -26
- {tactus-0.29.4 → tactus-0.31.0}/examples/03-basics-parameters.tac +2 -2
- {tactus-0.29.4 → tactus-0.31.0}/examples/04-basics-simple-agent.tac +3 -11
- {tactus-0.29.4 → tactus-0.31.0}/examples/05-basics-multi-model.tac +15 -19
- {tactus-0.29.4 → tactus-0.31.0}/examples/06-basics-streaming.tac +13 -8
- {tactus-0.29.4 → tactus-0.31.0}/examples/07-basics-bedrock.tac +6 -14
- {tactus-0.29.4 → tactus-0.31.0}/examples/08-basics-models.tac +26 -54
- {tactus-0.29.4 → tactus-0.31.0}/examples/09-basics-google-gemini.tac +9 -21
- {tactus-0.29.4 → tactus-0.31.0}/examples/10-feature-state.tac +2 -2
- {tactus-0.29.4 → tactus-0.31.0}/examples/11-feature-message-history.tac +2 -9
- {tactus-0.29.4 → tactus-0.31.0}/examples/12-feature-structured-output.tac +8 -15
- {tactus-0.29.4 → tactus-0.31.0}/examples/13-feature-session.tac +2 -9
- {tactus-0.29.4 → tactus-0.31.0}/examples/14-feature-per-turn-tools-simple.tac +18 -12
- {tactus-0.29.4 → tactus-0.31.0}/examples/14-feature-per-turn-tools.tac +10 -19
- {tactus-0.29.4 → tactus-0.31.0}/examples/15-feature-local-tools.tac +23 -16
- {tactus-0.29.4 → tactus-0.31.0}/examples/16-feature-toolsets-advanced.tac +30 -53
- {tactus-0.29.4 → tactus-0.31.0}/examples/17-feature-toolsets-dsl.tac +6 -15
- {tactus-0.29.4 → tactus-0.31.0}/examples/18-feature-lua-tools-individual.tac +8 -16
- {tactus-0.29.4 → tactus-0.31.0}/examples/18-feature-lua-tools-inline.tac +8 -18
- {tactus-0.29.4 → tactus-0.31.0}/examples/18-feature-lua-tools-toolset.tac +8 -15
- {tactus-0.29.4 → tactus-0.31.0}/examples/19-feature-direct-tool-calls.tac +3 -13
- {tactus-0.29.4 → tactus-0.31.0}/examples/20-bdd-complete.tac +33 -57
- tactus-0.29.4/examples/21-bdd-passing.tac.bak2 → tactus-0.31.0/examples/21-bdd-passing.tac +27 -39
- tactus-0.31.0/examples/22-bdd-fuzzy-matching.tac +32 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/30-eval-simple.tac +14 -3
- {tactus-0.29.4 → tactus-0.31.0}/examples/31-eval-demo.tac +4 -12
- {tactus-0.29.4 → tactus-0.31.0}/examples/32-eval-success-rate.tac +4 -12
- {tactus-0.29.4 → tactus-0.31.0}/examples/33-eval-thresholds.tac +4 -12
- {tactus-0.29.4 → tactus-0.31.0}/examples/34-eval-dataset.tac +5 -13
- {tactus-0.29.4 → tactus-0.31.0}/examples/35-eval-trace.tac +7 -19
- {tactus-0.29.4 → tactus-0.31.0}/examples/36-eval-advanced.tac +5 -13
- {tactus-0.29.4 → tactus-0.31.0}/examples/37-eval-comprehensive.tac +6 -14
- {tactus-0.29.4 → tactus-0.31.0}/examples/39-model-simple.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/40-mcp-test.tac +22 -8
- {tactus-0.29.4 → tactus-0.31.0}/examples/40-model-text-classifier.tac +7 -17
- {tactus-0.29.4 → tactus-0.31.0}/examples/41-mcp-simple.tac +21 -7
- {tactus-0.29.4 → tactus-0.31.0}/examples/41-model-pytorch.tac +7 -17
- {tactus-0.29.4 → tactus-0.31.0}/examples/43-sub-procedure-simple.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/44-sub-procedure-composition.tac +5 -13
- {tactus-0.29.4 → tactus-0.31.0}/examples/45-sub-procedure-recursive.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/46-checkpoint-explicit.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/47-checkpoint-expensive-ops.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/48-script-mode-simple.tac +11 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/50-inputs-showcase.tac +12 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/51-inputs-calculator.tac +13 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/52-file-io-basics.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/53-tsv-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/54-json-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/55-parquet-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/56-hdf5-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/57-excel-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/58-text-file-io.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/60-tool-sources.tac +6 -14
- {tactus-0.29.4 → tactus-0.31.0}/examples/61-inline-toolset-lua.tac +8 -16
- {tactus-0.29.4 → tactus-0.31.0}/examples/62-mcp-toolset-by-server.tac +20 -14
- {tactus-0.29.4 → tactus-0.31.0}/examples/63-toolset-import-from-file.tac +8 -16
- {tactus-0.29.4 → tactus-0.31.0}/examples/64-require-modules.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/65-optional-state-demo.tac +4 -12
- {tactus-0.29.4 → tactus-0.31.0}/examples/66-host-tools-via-broker.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/67-host-tool-source.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/70-mocking-static.tac +2 -2
- {tactus-0.29.4 → tactus-0.31.0}/examples/71-mocking-temporal.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/72-mocking-conditional.tac +2 -2
- tactus-0.31.0/examples/99-misc-test-loading.tac +30 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/README.md +11 -0
- tactus-0.31.0/examples/test-raw-module.tac +20 -0
- tactus-0.31.0/examples/test-raw-streaming.tac +20 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/with_dependencies/simple_http_test.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/examples/with_dependencies/time_lookup.tac +4 -4
- {tactus-0.29.4 → tactus-0.31.0}/features/17_lua_dsl_validation.feature +0 -1
- {tactus-0.29.4 → tactus-0.31.0}/features/20_parameters.feature +0 -1
- {tactus-0.29.4 → tactus-0.31.0}/features/21_outputs.feature +0 -1
- {tactus-0.29.4 → tactus-0.31.0}/features/23_prompts.feature +0 -1
- {tactus-0.29.4 → tactus-0.31.0}/features/24_bdd_specifications.feature +7 -16
- {tactus-0.29.4 → tactus-0.31.0}/features/25_bdd_custom_steps.feature +3 -3
- {tactus-0.29.4 → tactus-0.31.0}/features/26_bdd_evaluation.feature +4 -4
- {tactus-0.29.4 → tactus-0.31.0}/features/30_session_filters.feature +4 -4
- tactus-0.31.0/features/60_formatting.feature +37 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/documentation/Lua DSL/README.md +3 -13
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/example_procedures_steps.py +4 -0
- tactus-0.31.0/features/steps/formatting_steps.py +153 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/support/__init__.py +0 -2
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/support/harnesses.py +0 -100
- tactus-0.31.0/planning/FORMATTER.md +48 -0
- {tactus-0.29.4 → tactus-0.31.0}/pyproject.toml +1 -1
- tactus-0.31.0/scripts/run_precommit_suite.sh +60 -0
- tactus-0.31.0/scripts/timeout.py +49 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/__init__.py +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/lua_tools.py +23 -1
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/mcp_manager.py +62 -35
- tactus-0.31.0/tactus/broker/server.py +1123 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/cli/app.py +62 -1
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/dsl_stubs.py +138 -41
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/output_validator.py +69 -15
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/registry.py +13 -25
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/runtime.py +208 -69
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/agent.py +87 -30
- tactus-0.31.0/tactus/formatting/__init__.py +7 -0
- tactus-0.31.0/tactus/formatting/formatter.py +437 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/ide/server.py +0 -10
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/__init__.py +0 -2
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/handles.py +8 -3
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/procedure_callable.py +36 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/config.py +0 -5
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/result.py +3 -3
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/tac/tactus/tools/done.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/tac/tactus/tools/log.tac +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/README.md +1 -12
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/behave_integration.py +12 -2
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/context.py +156 -46
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/mock_agent.py +43 -8
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/steps/builtin.py +264 -54
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/test_runner.py +6 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/semantic_visitor.py +19 -11
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/BUILD_GUIDE.md +10 -1
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/test_script_mode.py +6 -2
- {tactus-0.29.4 → tactus-0.31.0}/tests/dspy/test_mock_field_normalization.py +10 -31
- tactus-0.31.0/tests/fixtures/brave_search_mcp_server.py +36 -0
- tactus-0.31.0/tests/fixtures/filesystem_mcp_server.py +38 -0
- tactus-0.31.0/tests/test_formatter.py +77 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/test_mcp_integration.py +1 -1
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_all_examples.py +55 -22
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_e2e.py +18 -22
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_integration.py +2 -3
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_runtime_integration.py +17 -23
- tactus-0.29.4/TECHNICAL_DEBT.md +0 -262
- tactus-0.29.4/examples/01-basics-hello-world.tac +0 -15
- tactus-0.29.4/examples/20-bdd-complete.tac.bak2 +0 -122
- tactus-0.29.4/examples/21-bdd-passing.tac +0 -102
- tactus-0.29.4/examples/35-eval-trace.tac.bak2 +0 -132
- tactus-0.29.4/examples/37-eval-comprehensive.tac.bak2 +0 -129
- tactus-0.29.4/examples/99-misc-test-loading.tac +0 -20
- tactus-0.29.4/examples/test-raw-module.tac +0 -11
- tactus-0.29.4/examples/test-raw-streaming.tac +0 -11
- tactus-0.29.4/features/14_stage_and_step_tracking.feature +0 -73
- tactus-0.29.4/features/steps/stage_tracking_steps.py +0 -282
- tactus-0.29.4/tactus/broker/server.py +0 -517
- tactus-0.29.4/tactus/primitives/stage.py +0 -202
- {tactus-0.29.4 → tactus-0.31.0}/.claude/agents.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/.github/workflows/release.yml +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/.gitignore +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/.tactus/config.yml.example +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/LICENSE +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/Makefile +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/behave.ini +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/AGENTS.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/CONFIGURATION.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/FILE_IO.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/SANDBOXING.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/STREAMING.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/docs/development-mode.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/app_config.ini +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/data/sample.csv +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/demo_output.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/helpers/math_module.tac +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/helpers/product.tac +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/helpers/string_module.tac +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/helpers/sum.tac +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/inventory_summary.tsv +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/mock-config.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/models/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/output_summary.txt +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/tools/calculations.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/tools/data_analysis.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/tools/search.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/examples/with_dependencies/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/01_state_management.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/02_checkpointing.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/04_control_flow.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/05_tool_integration.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/06_retry_logic.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/07_file_operations.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/08_agent_primitives.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/09_workflow_execution.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/10_lua_integration.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/11_storage_backends.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/12_json_operations.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/13_logging.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/15_procedure_calls.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/16_session_management.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/18_example_procedures.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/19_ide_server.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/27_default_settings.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/28_custom_prompts.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/29_execution_settings.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/31_matchers.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/32_result_object.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/33_output_type.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/42_model_primitive.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/48_script_mode.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/52_dspy_signature.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/53_dspy_module.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/54_dspy_history.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/56_dspy_agent.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/57_chat_assistant.feature +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/environment.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/chat_assistant_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/logging_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/mocking_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/result_and_output_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/session_management_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/state_management_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/scripts/convert_examples.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/start-web-ide.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/broker_log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/cli_log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/cost_collector_log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/mcp.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/memory.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/adapters/plugins.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/backends/http_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/backends/model_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/broker/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/broker/client.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/broker/protocol.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/broker/stdio.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/cli/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/config_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/exceptions.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/execution_context.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/mocking.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/template_resolver.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/docker/Dockerfile +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/broker_lm.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/config.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/history.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/module.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/prediction.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/dspy/signature.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/ide/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/ide/coding_assistant.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/control.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/file.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/host.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/human.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/json.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/log.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/message_history.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/model.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/procedure.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/retry.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/session.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/state.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/step.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/system.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/tool.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/primitives/toolset.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/cost.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/log_handler.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/models.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/protocols/storage.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/providers/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/providers/base.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/providers/bedrock.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/providers/google.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/providers/openai.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/config.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/container_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/docker_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/entrypoint.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/sandbox/protocol.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/fs.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/stdlib/loader.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/eval_models.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/evaluators.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/events.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/mock_tools.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/models.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/tracing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/utils/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/error_listener.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus/validation/validator.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/.gitignore +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/package.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/resources/app-icon.icns +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/resources/app-icon.ico +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/resources/app-icon.png +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/assistant_service.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/assistant_tools.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/chat_server.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/config_server.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/events.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/backend/text_editor_tool.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/dev.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/package-lock.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/App.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/types/events.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/package.json +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/test-ci.sh +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/adapters/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/broker/test_broker_host_tool_source.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/broker/test_broker_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/broker/test_broker_tcp_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/broker/test_broker_tcp_unit.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/broker/test_brokered_lm_unit.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/cli/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/cli/test_cli.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/conftest.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/test_config_manager.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/dspy/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/dspy/test_module_parameter.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/dspy/test_prediction_messages.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/fixtures/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/mocks/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_host_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_system_alert.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/sandbox/test_container_runner.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/stdlib/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/test_tracing.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/conftest.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_models.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/utils/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/validation/__init__.py +0 -0
- {tactus-0.29.4 → tactus-0.31.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
|
@@ -376,6 +376,10 @@ Tactus has two distinct testing mechanisms that serve different purposes:
|
|
|
376
376
|
|
|
377
377
|
The Tactus CLI provides powerful tools for developing and debugging agents.
|
|
378
378
|
|
|
379
|
+
### Formatting `.tac` Files
|
|
380
|
+
|
|
381
|
+
Use `tactus format` to automatically reindent and normalize whitespace in `.tac` files.
|
|
382
|
+
|
|
379
383
|
### Running and Debugging Procedures
|
|
380
384
|
|
|
381
385
|
When you run a procedure with `tactus run`, you get real-time visibility into what's happening:
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.31.0 (2026-01-15)
|
|
6
|
+
|
|
7
|
+
### Chores
|
|
8
|
+
|
|
9
|
+
- Merge origin/main
|
|
10
|
+
([`dd8c4d4`](https://github.com/AnthusAI/Tactus/commit/dd8c4d4aa08cf4d7aaf8be69e76309a66be36ec8))
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
|
|
14
|
+
- Add workaround for macOS Gatekeeper damaged app error
|
|
15
|
+
([`cbf9b38`](https://github.com/AnthusAI/Tactus/commit/cbf9b38a25a99d8f0ff8949e3a646ed69d276713))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## v0.30.0 (2026-01-15)
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v0.29.4 (2026-01-15)
|
|
6
22
|
|
|
7
23
|
### Bug Fixes
|
|
@@ -993,24 +993,6 @@ On replay, completed sub-procedure calls return cached results without re-execut
|
|
|
993
993
|
- DSL Stub: `tactus/core/dsl_stubs.py` (`_procedure` function)
|
|
994
994
|
- Registry: `tactus/core/registry.py`
|
|
995
995
|
|
|
996
|
-
### Stages
|
|
997
|
-
|
|
998
|
-
#### StagePrimitive (`tactus/primitives/stage.py`)
|
|
999
|
-
|
|
1000
|
-
**Status**: ✅ **Fully Implemented**
|
|
1001
|
-
|
|
1002
|
-
**Features:**
|
|
1003
|
-
- ✅ `Stage.set(name)` - Set current stage
|
|
1004
|
-
- ✅ `Stage.current()` - Get current stage
|
|
1005
|
-
- ✅ `Stage.advance()` - Move to next stage in sequence
|
|
1006
|
-
- ✅ `Stage.is(name)` - Check if in specific stage (mapped from Lua `is` keyword)
|
|
1007
|
-
- ✅ `Stage.history()` - Get transition history
|
|
1008
|
-
|
|
1009
|
-
**Implementation:**
|
|
1010
|
-
- Validates stage names against `stages:` declaration in YAML
|
|
1011
|
-
- Tracks stage transitions with timestamps
|
|
1012
|
-
- Returns history as Lua table
|
|
1013
|
-
|
|
1014
996
|
### Exception Handling
|
|
1015
997
|
|
|
1016
998
|
**Specification**: Supports `pcall()` for protected calls.
|
|
@@ -1300,10 +1282,6 @@ procedure "order_fulfillment" {
|
|
|
1300
1282
|
|
|
1301
1283
|
**Location**: `tactus/primitives/state.py`
|
|
1302
1284
|
|
|
1303
|
-
#### Stage Primitives
|
|
1304
|
-
|
|
1305
|
-
**Status**: ✅ **Fully Implemented** (see Stages section above)
|
|
1306
|
-
|
|
1307
1285
|
#### Control Primitives
|
|
1308
1286
|
|
|
1309
1287
|
#### IterationsPrimitive (`tactus/primitives/control.py`)
|
|
@@ -1669,7 +1647,6 @@ Defines interface for persistence.
|
|
|
1669
1647
|
|
|
1670
1648
|
**Built-in Steps:**
|
|
1671
1649
|
- Tool steps: `the {tool} tool should be called`, `at least {n} times`, `with {param}={value}`
|
|
1672
|
-
- Stage steps: `the stage should be {stage}`, `transition from {s1} to {s2}`
|
|
1673
1650
|
- State steps: `the state {key} should be {value}`, `should exist`
|
|
1674
1651
|
- Completion steps: `should complete successfully`, `stop reason should contain {text}`
|
|
1675
1652
|
- Iteration steps: `iterations should be less than {n}`, `between {min} and {max}`
|
|
@@ -1816,7 +1793,6 @@ tactus/
|
|
|
1816
1793
|
│ ├── tool.py # ToolPrimitive
|
|
1817
1794
|
│ ├── human.py # HumanPrimitive (HITL)
|
|
1818
1795
|
│ ├── step.py # StepPrimitive, checkpoint() function
|
|
1819
|
-
│ ├── stage.py # StagePrimitive
|
|
1820
1796
|
│ ├── control.py # IterationsPrimitive, StopPrimitive
|
|
1821
1797
|
│ ├── log.py # LogPrimitive
|
|
1822
1798
|
│ ├── json.py # JsonPrimitive
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tactus
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.31.0
|
|
4
4
|
Summary: Tactus: Lua-based DSL for agentic workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/AnthusAI/Tactus
|
|
6
6
|
Project-URL: Documentation, https://github.com/AnthusAI/Tactus/tree/main/docs
|
|
@@ -170,7 +170,7 @@ Procedure {
|
|
|
170
170
|
end
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
Specification([[
|
|
174
174
|
Feature: Research
|
|
175
175
|
Scenario: Completes research
|
|
176
176
|
When the researcher agent takes turns
|
|
@@ -421,12 +421,12 @@ calculator = Agent {
|
|
|
421
421
|
done = tactus.done
|
|
422
422
|
|
|
423
423
|
text_processor = Agent {
|
|
424
|
-
|
|
425
|
-
done,
|
|
424
|
+
inline_tools = {
|
|
426
425
|
{name = "uppercase", input = {...}, handler = function(args)
|
|
427
426
|
return string.upper(args.text)
|
|
428
427
|
end}
|
|
429
|
-
}
|
|
428
|
+
},
|
|
429
|
+
tools = {done}
|
|
430
430
|
}
|
|
431
431
|
```
|
|
432
432
|
|
|
@@ -533,7 +533,7 @@ Procedure {
|
|
|
533
533
|
end
|
|
534
534
|
}
|
|
535
535
|
|
|
536
|
-
|
|
536
|
+
Specification([[
|
|
537
537
|
Feature: Greeting
|
|
538
538
|
Scenario: Agent greets and completes
|
|
539
539
|
When the greeter agent takes turns
|
|
@@ -616,7 +616,7 @@ This creates a rhythm: **tool call → summarization → tool call → summariza
|
|
|
616
616
|
|
|
617
617
|
**Why this matters:**
|
|
618
618
|
|
|
619
|
-
Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting
|
|
619
|
+
Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting toolsets to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
|
|
620
620
|
|
|
621
621
|
**Other per-call overrides:**
|
|
622
622
|
|
|
@@ -731,10 +731,9 @@ Then the search tool should be called exactly 2 times
|
|
|
731
731
|
Then the search tool should be called with query=test
|
|
732
732
|
```
|
|
733
733
|
|
|
734
|
-
**State
|
|
734
|
+
**State Steps:**
|
|
735
735
|
```gherkin
|
|
736
736
|
Given the procedure has started
|
|
737
|
-
Then the stage should be processing
|
|
738
737
|
Then the state count should be 5
|
|
739
738
|
Then the state error should exist
|
|
740
739
|
```
|
|
@@ -866,10 +865,9 @@ Then the search tool should be called exactly 2 times
|
|
|
866
865
|
Then the search tool should be called with query=test
|
|
867
866
|
```
|
|
868
867
|
|
|
869
|
-
**State
|
|
868
|
+
**State Steps:**
|
|
870
869
|
```gherkin
|
|
871
870
|
Given the procedure has started
|
|
872
|
-
Then the stage should be processing
|
|
873
871
|
Then the state count should be 5
|
|
874
872
|
Then the state error should exist
|
|
875
873
|
```
|
|
@@ -1665,6 +1663,12 @@ Agents:
|
|
|
1665
1663
|
# Validate syntax and structure
|
|
1666
1664
|
tactus validate workflow.tac
|
|
1667
1665
|
|
|
1666
|
+
# Format a workflow file (2-space indentation + normalized spacing)
|
|
1667
|
+
tactus format workflow.tac
|
|
1668
|
+
|
|
1669
|
+
# Check formatting without rewriting (exit 1 if changes needed)
|
|
1670
|
+
tactus format workflow.tac --check
|
|
1671
|
+
|
|
1668
1672
|
# Run BDD specifications
|
|
1669
1673
|
tactus test workflow.tac
|
|
1670
1674
|
|
|
@@ -1675,6 +1679,8 @@ tactus test workflow.tac --runs 10
|
|
|
1675
1679
|
tactus eval workflow.tac --runs 10
|
|
1676
1680
|
```
|
|
1677
1681
|
|
|
1682
|
+
The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
|
|
1683
|
+
|
|
1678
1684
|
### Understanding Output
|
|
1679
1685
|
|
|
1680
1686
|
The CLI displays several types of events:
|
|
@@ -119,7 +119,7 @@ Procedure {
|
|
|
119
119
|
end
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
Specification([[
|
|
123
123
|
Feature: Research
|
|
124
124
|
Scenario: Completes research
|
|
125
125
|
When the researcher agent takes turns
|
|
@@ -370,12 +370,12 @@ calculator = Agent {
|
|
|
370
370
|
done = tactus.done
|
|
371
371
|
|
|
372
372
|
text_processor = Agent {
|
|
373
|
-
|
|
374
|
-
done,
|
|
373
|
+
inline_tools = {
|
|
375
374
|
{name = "uppercase", input = {...}, handler = function(args)
|
|
376
375
|
return string.upper(args.text)
|
|
377
376
|
end}
|
|
378
|
-
}
|
|
377
|
+
},
|
|
378
|
+
tools = {done}
|
|
379
379
|
}
|
|
380
380
|
```
|
|
381
381
|
|
|
@@ -482,7 +482,7 @@ Procedure {
|
|
|
482
482
|
end
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
|
|
485
|
+
Specification([[
|
|
486
486
|
Feature: Greeting
|
|
487
487
|
Scenario: Agent greets and completes
|
|
488
488
|
When the greeter agent takes turns
|
|
@@ -565,7 +565,7 @@ This creates a rhythm: **tool call → summarization → tool call → summariza
|
|
|
565
565
|
|
|
566
566
|
**Why this matters:**
|
|
567
567
|
|
|
568
|
-
Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting
|
|
568
|
+
Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting toolsets to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
|
|
569
569
|
|
|
570
570
|
**Other per-call overrides:**
|
|
571
571
|
|
|
@@ -680,10 +680,9 @@ Then the search tool should be called exactly 2 times
|
|
|
680
680
|
Then the search tool should be called with query=test
|
|
681
681
|
```
|
|
682
682
|
|
|
683
|
-
**State
|
|
683
|
+
**State Steps:**
|
|
684
684
|
```gherkin
|
|
685
685
|
Given the procedure has started
|
|
686
|
-
Then the stage should be processing
|
|
687
686
|
Then the state count should be 5
|
|
688
687
|
Then the state error should exist
|
|
689
688
|
```
|
|
@@ -815,10 +814,9 @@ Then the search tool should be called exactly 2 times
|
|
|
815
814
|
Then the search tool should be called with query=test
|
|
816
815
|
```
|
|
817
816
|
|
|
818
|
-
**State
|
|
817
|
+
**State Steps:**
|
|
819
818
|
```gherkin
|
|
820
819
|
Given the procedure has started
|
|
821
|
-
Then the stage should be processing
|
|
822
820
|
Then the state count should be 5
|
|
823
821
|
Then the state error should exist
|
|
824
822
|
```
|
|
@@ -1614,6 +1612,12 @@ Agents:
|
|
|
1614
1612
|
# Validate syntax and structure
|
|
1615
1613
|
tactus validate workflow.tac
|
|
1616
1614
|
|
|
1615
|
+
# Format a workflow file (2-space indentation + normalized spacing)
|
|
1616
|
+
tactus format workflow.tac
|
|
1617
|
+
|
|
1618
|
+
# Check formatting without rewriting (exit 1 if changes needed)
|
|
1619
|
+
tactus format workflow.tac --check
|
|
1620
|
+
|
|
1617
1621
|
# Run BDD specifications
|
|
1618
1622
|
tactus test workflow.tac
|
|
1619
1623
|
|
|
@@ -1624,6 +1628,8 @@ tactus test workflow.tac --runs 10
|
|
|
1624
1628
|
tactus eval workflow.tac --runs 10
|
|
1625
1629
|
```
|
|
1626
1630
|
|
|
1631
|
+
The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
|
|
1632
|
+
|
|
1627
1633
|
### Understanding Output
|
|
1628
1634
|
|
|
1629
1635
|
The CLI displays several types of events:
|
|
@@ -47,9 +47,6 @@ worker = Agent {
|
|
|
47
47
|
tools = {done} -- Variable references, not strings
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
-- Stages (optional)
|
|
51
|
-
Stages({"planning", "executing", "complete"})
|
|
52
|
-
|
|
53
50
|
-- Procedure (unnamed, defaults to "main")
|
|
54
51
|
Procedure {
|
|
55
52
|
-- Input (using field builder syntax)
|
|
@@ -83,7 +80,7 @@ Procedure {
|
|
|
83
80
|
}
|
|
84
81
|
|
|
85
82
|
-- BDD Specifications (optional)
|
|
86
|
-
|
|
83
|
+
Specification([[
|
|
87
84
|
Feature: Task Processing
|
|
88
85
|
Scenario: Task completes successfully
|
|
89
86
|
Given the procedure has started
|
|
@@ -95,12 +92,12 @@ Feature: Task Processing
|
|
|
95
92
|
|
|
96
93
|
**Key structure:**
|
|
97
94
|
- **Tools** defined as `name = Tool {...}` or imported via `require()` like `local done = require("tactus.tools.done")`
|
|
98
|
-
- **Agents** defined as `name = Agent {...}` with `tools = {
|
|
95
|
+
- **Agents** defined as `name = Agent {...}` with `tools = {...}`; `tools = {...}` is reserved for inline tool definitions only
|
|
99
96
|
- **Procedure { }** unnamed, defaults to "main"
|
|
100
97
|
- Config fields: `input`, `output`, `state` (state is optional)
|
|
101
98
|
- Function as the last element containing the procedure logic
|
|
102
99
|
- **Agent calls** use callable syntax: `worker()` or `worker({message = "..."})`
|
|
103
|
-
- **Specifications()** at top level for BDD tests
|
|
100
|
+
- **Specification()** / **Specifications()** at top level for BDD tests
|
|
104
101
|
|
|
105
102
|
---
|
|
106
103
|
|
|
@@ -292,7 +289,7 @@ researcher = Agent {
|
|
|
292
289
|
provider = "openai",
|
|
293
290
|
model = "gpt-4o",
|
|
294
291
|
system_prompt = "Research the topic",
|
|
295
|
-
|
|
292
|
+
tools = {"brave_search", "done"}, -- MCP tools referenced by name
|
|
296
293
|
|
|
297
294
|
message_history = {
|
|
298
295
|
source = "shared", -- Use shared history
|
|
@@ -1122,34 +1119,6 @@ local result = Human.approve({
|
|
|
1122
1119
|
-- If on_timeout = "error", throws exception on timeout
|
|
1123
1120
|
```
|
|
1124
1121
|
|
|
1125
|
-
### HITL Stage Integration
|
|
1126
|
-
|
|
1127
|
-
When a procedure is waiting for human interaction, its stage reflects this:
|
|
1128
|
-
|
|
1129
|
-
```lua
|
|
1130
|
-
Stage.set("processing")
|
|
1131
|
-
do_work()
|
|
1132
|
-
|
|
1133
|
-
-- Procedure status becomes "waiting_for_human" during this call
|
|
1134
|
-
local approved = Human.approve({message = "Continue?"})
|
|
1135
|
-
|
|
1136
|
-
Stage.set("finalizing")
|
|
1137
|
-
```
|
|
1138
|
-
|
|
1139
|
-
Parent procedures can detect this:
|
|
1140
|
-
|
|
1141
|
-
```lua
|
|
1142
|
-
local handle = Procedure.spawn("deployment", params)
|
|
1143
|
-
|
|
1144
|
-
local status = Procedure.status(handle)
|
|
1145
|
-
if status.waiting_for_human then
|
|
1146
|
-
-- Maybe notify via Slack
|
|
1147
|
-
notify_channel("Deployment waiting for approval")
|
|
1148
|
-
end
|
|
1149
|
-
```
|
|
1150
|
-
|
|
1151
|
-
---
|
|
1152
|
-
|
|
1153
1122
|
## Human-AI Chat (Non-Procedural)
|
|
1154
1123
|
|
|
1155
1124
|
The same `ChatSession` and `ChatMessage` infrastructure supports regular conversational AI assistants that aren't running procedure workflows.
|
|
@@ -1327,8 +1296,7 @@ The runtime detects script mode during execution and performs source transformat
|
|
|
1327
1296
|
- `input {}`
|
|
1328
1297
|
- `output {}`
|
|
1329
1298
|
- `Mocks {}`
|
|
1330
|
-
- `
|
|
1331
|
-
- `Specifications()`
|
|
1299
|
+
- `Specification()` / `Specifications()`
|
|
1332
1300
|
- Agent definitions: `name = Agent {}`
|
|
1333
1301
|
- Tool definitions: `name = Tool {}` or imported via `require()` like `local done = require("tactus.tools.done")`
|
|
1334
1302
|
- Model definitions: `name = Model {}`
|
|
@@ -1460,7 +1428,7 @@ Context: {prepared.data}
|
|
|
1460
1428
|
|
|
1461
1429
|
initial_message = "Begin working on the task.",
|
|
1462
1430
|
|
|
1463
|
-
|
|
1431
|
+
tools = {"brave_search_search", "done"}, -- MCP tools referenced by string name
|
|
1464
1432
|
|
|
1465
1433
|
filter = {
|
|
1466
1434
|
class = "ComposedFilter",
|
|
@@ -1995,8 +1963,7 @@ local done = require("tactus.tools.done")
|
|
|
1995
1963
|
text_processor = Agent {
|
|
1996
1964
|
provider = "openai",
|
|
1997
1965
|
system_prompt = "You process text",
|
|
1998
|
-
|
|
1999
|
-
done,
|
|
1966
|
+
inline_tools = {
|
|
2000
1967
|
{
|
|
2001
1968
|
name = "uppercase",
|
|
2002
1969
|
description = "Convert text to uppercase",
|
|
@@ -2017,7 +1984,8 @@ text_processor = Agent {
|
|
|
2017
1984
|
return string.reverse(args.text)
|
|
2018
1985
|
end
|
|
2019
1986
|
}
|
|
2020
|
-
}
|
|
1987
|
+
},
|
|
1988
|
+
tools = {done}
|
|
2021
1989
|
}
|
|
2022
1990
|
```
|
|
2023
1991
|
|
|
@@ -2025,10 +1993,9 @@ Inline tools are automatically prefixed with the agent name (e.g., `text_process
|
|
|
2025
1993
|
|
|
2026
1994
|
**Tools in Agent Config**
|
|
2027
1995
|
|
|
2028
|
-
In agent configuration
|
|
2029
|
-
- **
|
|
2030
|
-
- **
|
|
2031
|
-
- **Inline tool definitions** (objects with `name`, `handler`, `input`)
|
|
1996
|
+
In agent configuration:
|
|
1997
|
+
- `tools` accepts **tool/toolset references** and toolset expressions.
|
|
1998
|
+
- `inline_tools` is reserved for **inline tool definitions** (objects with `name`, `handler`, `input`).
|
|
2032
1999
|
|
|
2033
2000
|
```lua
|
|
2034
2001
|
local done = require("tactus.tools.done")
|
|
@@ -2036,11 +2003,13 @@ calculate_tip = Tool {...}
|
|
|
2036
2003
|
math_tools = Toolset {...}
|
|
2037
2004
|
|
|
2038
2005
|
example = Agent {
|
|
2039
|
-
|
|
2040
|
-
done, -- Variable reference to tool
|
|
2041
|
-
calculate_tip, -- Variable reference to tool
|
|
2042
|
-
math_tools, -- Variable reference to toolset
|
|
2006
|
+
inline_tools = {
|
|
2043
2007
|
{name = "my_tool", handler = function(args) ... end, ...} -- Inline
|
|
2008
|
+
},
|
|
2009
|
+
tools = {
|
|
2010
|
+
done, -- Tool reference
|
|
2011
|
+
calculate_tip, -- Tool reference
|
|
2012
|
+
math_tools, -- Toolset reference
|
|
2044
2013
|
}
|
|
2045
2014
|
}
|
|
2046
2015
|
```
|
|
@@ -2156,35 +2125,6 @@ local status = handle.status()
|
|
|
2156
2125
|
local result = handle.wait()
|
|
2157
2126
|
```
|
|
2158
2127
|
|
|
2159
|
-
---
|
|
2160
|
-
|
|
2161
|
-
## Stages
|
|
2162
|
-
|
|
2163
|
-
Stages integrate with TaskStages monitoring:
|
|
2164
|
-
|
|
2165
|
-
```lua
|
|
2166
|
-
-- Define stages at top level
|
|
2167
|
-
Stages({"planning", "executing", "awaiting_human", "complete"})
|
|
2168
|
-
|
|
2169
|
-
-- Use in procedure
|
|
2170
|
-
Procedure {
|
|
2171
|
-
function(input)
|
|
2172
|
-
Stage.set("planning")
|
|
2173
|
-
-- Do planning work...
|
|
2174
|
-
|
|
2175
|
-
Stage.advance("executing")
|
|
2176
|
-
-- Execute tasks...
|
|
2177
|
-
|
|
2178
|
-
Stage.is("planning") -- false
|
|
2179
|
-
Stage.current() -- "executing"
|
|
2180
|
-
|
|
2181
|
-
-- Continue with rest of procedure...
|
|
2182
|
-
end
|
|
2183
|
-
}
|
|
2184
|
-
```
|
|
2185
|
-
|
|
2186
|
-
---
|
|
2187
|
-
|
|
2188
2128
|
## Exception Handling
|
|
2189
2129
|
|
|
2190
2130
|
```lua
|
|
@@ -2298,15 +2238,15 @@ response.tool_calls
|
|
|
2298
2238
|
The callable agent accepts an optional table to override behavior for a single call:
|
|
2299
2239
|
|
|
2300
2240
|
**Available overrides:**
|
|
2301
|
-
- `message` (string) - Message to send to the agent
|
|
2241
|
+
- `message` (string) - Message to send to the agent
|
|
2302
2242
|
- `context` (table) - Key-value pairs to pass as context to the agent (formatted as structured input)
|
|
2303
|
-
- `tools` (list of
|
|
2243
|
+
- `tools` (list of toolset expressions) - Tools/toolsets available for this call (empty list = no tools)
|
|
2304
2244
|
- `temperature` (number) - Override temperature for this call
|
|
2305
2245
|
- `max_tokens` (number) - Override max_tokens for this call
|
|
2306
2246
|
- `top_p` (number) - Override top_p for this call
|
|
2307
2247
|
|
|
2308
2248
|
**Tool Override Behavior:**
|
|
2309
|
-
- `tools` - List of tool/toolset
|
|
2249
|
+
- `tools` - List of tool/toolset references to enable: `{search, done, math_tools}`
|
|
2310
2250
|
- Empty list `{}`: No tools available for this call
|
|
2311
2251
|
- `nil`/omitted: Use agent's default configuration
|
|
2312
2252
|
|
|
@@ -2406,16 +2346,6 @@ State.append("list", item) -- Append to a list
|
|
|
2406
2346
|
State.all() -- Get all state as table
|
|
2407
2347
|
```
|
|
2408
2348
|
|
|
2409
|
-
### Stage Primitives
|
|
2410
|
-
|
|
2411
|
-
```lua
|
|
2412
|
-
Stage.current()
|
|
2413
|
-
Stage.set(name)
|
|
2414
|
-
Stage.advance(name)
|
|
2415
|
-
Stage.is(name)
|
|
2416
|
-
Stage.history()
|
|
2417
|
-
```
|
|
2418
|
-
|
|
2419
2349
|
### Control Primitives
|
|
2420
2350
|
|
|
2421
2351
|
```lua
|
|
@@ -2534,7 +2464,7 @@ end
|
|
|
2534
2464
|
Matchers are primarily used in BDD specifications for testing:
|
|
2535
2465
|
|
|
2536
2466
|
```lua
|
|
2537
|
-
|
|
2467
|
+
Specification([[
|
|
2538
2468
|
Feature: Data Processing
|
|
2539
2469
|
Scenario: Process valid data
|
|
2540
2470
|
Given the procedure has started
|
|
@@ -2556,9 +2486,9 @@ local error_matcher = contains("error")
|
|
|
2556
2486
|
|
|
2557
2487
|
-- Use in conditional logic
|
|
2558
2488
|
local result = worker()
|
|
2559
|
-
if tostring(result.
|
|
2489
|
+
if tostring(result.output):find("success") then
|
|
2560
2490
|
-- Contains success
|
|
2561
|
-
elseif tostring(result.
|
|
2491
|
+
elseif tostring(result.output):find("error") then
|
|
2562
2492
|
-- Contains error
|
|
2563
2493
|
end
|
|
2564
2494
|
```
|
|
@@ -2586,9 +2516,6 @@ end
|
|
|
2586
2516
|
## Example: HITL Workflow
|
|
2587
2517
|
|
|
2588
2518
|
```lua
|
|
2589
|
-
-- Define stages at top level
|
|
2590
|
-
Stages({"researching", "writing", "review", "publishing", "complete"})
|
|
2591
|
-
|
|
2592
2519
|
-- Define tools
|
|
2593
2520
|
local done = require("tactus.tools.done")
|
|
2594
2521
|
research = Tool {
|
|
@@ -2654,14 +2581,12 @@ Procedure {
|
|
|
2654
2581
|
},
|
|
2655
2582
|
|
|
2656
2583
|
function(input)
|
|
2657
|
-
Stage.set("researching")
|
|
2658
2584
|
Human.notify({
|
|
2659
2585
|
message = "Starting content generation",
|
|
2660
2586
|
level = "info",
|
|
2661
2587
|
context = {topic = input.topic, target = input.target}
|
|
2662
2588
|
})
|
|
2663
2589
|
|
|
2664
|
-
Stage.set("writing")
|
|
2665
2590
|
repeat
|
|
2666
2591
|
writer()
|
|
2667
2592
|
until done.called() or Iterations.exceeded(20)
|
|
@@ -2671,7 +2596,6 @@ Procedure {
|
|
|
2671
2596
|
end
|
|
2672
2597
|
|
|
2673
2598
|
-- Human review
|
|
2674
|
-
Stage.set("review")
|
|
2675
2599
|
local review = Human.review("review_content", {
|
|
2676
2600
|
artifact = state.draft,
|
|
2677
2601
|
artifact_type = "document"
|
|
@@ -2693,7 +2617,6 @@ Procedure {
|
|
|
2693
2617
|
local final_content = review.edited_artifact or state.draft
|
|
2694
2618
|
|
|
2695
2619
|
-- Approval to publish
|
|
2696
|
-
Stage.set("publishing")
|
|
2697
2620
|
local approved = Human.approve("confirm_publish")
|
|
2698
2621
|
|
|
2699
2622
|
if not approved then
|
|
@@ -2710,7 +2633,6 @@ Procedure {
|
|
|
2710
2633
|
context = {url = url}
|
|
2711
2634
|
})
|
|
2712
2635
|
|
|
2713
|
-
Stage.set("complete")
|
|
2714
2636
|
return {published = true, url = url}
|
|
2715
2637
|
end
|
|
2716
2638
|
}
|
|
@@ -2721,9 +2643,6 @@ Procedure {
|
|
|
2721
2643
|
## Example: System Monitoring with Alerts
|
|
2722
2644
|
|
|
2723
2645
|
```lua
|
|
2724
|
-
-- Define stages at top level
|
|
2725
|
-
Stages({"processing", "complete"})
|
|
2726
|
-
|
|
2727
2646
|
-- Main procedure
|
|
2728
2647
|
Procedure {
|
|
2729
2648
|
input = {
|
|
@@ -2741,8 +2660,6 @@ Procedure {
|
|
|
2741
2660
|
local failed = 0
|
|
2742
2661
|
local total = #input.items
|
|
2743
2662
|
|
|
2744
|
-
Stage.set("processing")
|
|
2745
|
-
|
|
2746
2663
|
for i, item in ipairs(input.items) do
|
|
2747
2664
|
local ok, result = pcall(process_item, item)
|
|
2748
2665
|
|
|
@@ -2789,8 +2706,6 @@ Procedure {
|
|
|
2789
2706
|
end
|
|
2790
2707
|
end
|
|
2791
2708
|
|
|
2792
|
-
Stage.set("complete")
|
|
2793
|
-
|
|
2794
2709
|
-- Final status
|
|
2795
2710
|
local level = failed > 0 and "warning" or "info"
|
|
2796
2711
|
Human.notify({
|
|
@@ -2821,8 +2736,6 @@ A comprehensive example showing HITL with checkpointed tool calls, evaluation, a
|
|
|
2821
2736
|
-- Note: This is a complex example showing multiple advanced features
|
|
2822
2737
|
|
|
2823
2738
|
-- Define stages
|
|
2824
|
-
Stages({"analyzing", "drafting", "evaluating", "awaiting_approval", "promoting", "complete"})
|
|
2825
|
-
|
|
2826
2739
|
-- Import completion tool from standard library
|
|
2827
2740
|
local done = require("tactus.tools.done")
|
|
2828
2741
|
|
|
@@ -2837,7 +2750,7 @@ Score ID: {input.score_id}
|
|
|
2837
2750
|
Champion metrics: {state.champion_metrics}
|
|
2838
2751
|
Error patterns: {state.error_analysis}
|
|
2839
2752
|
]],
|
|
2840
|
-
|
|
2753
|
+
tools = {"plexus_get_score", "plexus_get_evaluation_metrics", "plexus_analyze_errors", "done"},
|
|
2841
2754
|
max_turns = 20
|
|
2842
2755
|
}
|
|
2843
2756
|
|
|
@@ -2851,7 +2764,7 @@ Human feedback (if any): {state.human_feedback}
|
|
|
2851
2764
|
|
|
2852
2765
|
Be conservative - small targeted improvements are better than sweeping changes.
|
|
2853
2766
|
]],
|
|
2854
|
-
|
|
2767
|
+
tools = {"plexus_draft_score_config", "plexus_validate_config", "done"},
|
|
2855
2768
|
max_turns = 15
|
|
2856
2769
|
}
|
|
2857
2770
|
|
|
@@ -2889,7 +2802,6 @@ Procedure {
|
|
|
2889
2802
|
local attempt = 1
|
|
2890
2803
|
|
|
2891
2804
|
-- Evaluate champion FIRST (checkpointed, runs once)
|
|
2892
|
-
Stage.set("analyzing")
|
|
2893
2805
|
|
|
2894
2806
|
state.champion_config = Step.checkpoint(function()
|
|
2895
2807
|
return plexus_get_score.run({score_id = input.score_id})
|
|
@@ -2922,7 +2834,6 @@ Procedure {
|
|
|
2922
2834
|
state.analysis_findings = done.last_result()
|
|
2923
2835
|
|
|
2924
2836
|
-- Draft improved configuration
|
|
2925
|
-
Stage.set("drafting")
|
|
2926
2837
|
|
|
2927
2838
|
repeat
|
|
2928
2839
|
drafter()
|
|
@@ -2936,7 +2847,6 @@ Procedure {
|
|
|
2936
2847
|
state.candidate_config = candidate_config
|
|
2937
2848
|
|
|
2938
2849
|
-- Evaluate candidate (checkpointed per attempt)
|
|
2939
|
-
Stage.set("evaluating")
|
|
2940
2850
|
|
|
2941
2851
|
local eval_result = Step.checkpoint(function()
|
|
2942
2852
|
return plexus_run_evaluation.run({
|
|
@@ -2972,7 +2882,6 @@ Procedure {
|
|
|
2972
2882
|
end
|
|
2973
2883
|
else
|
|
2974
2884
|
-- Request human approval
|
|
2975
|
-
Stage.set("awaiting_approval")
|
|
2976
2885
|
|
|
2977
2886
|
local review = Human.review("approval_to_promote", {
|
|
2978
2887
|
artifact = {
|
|
@@ -2985,8 +2894,6 @@ Procedure {
|
|
|
2985
2894
|
})
|
|
2986
2895
|
|
|
2987
2896
|
if review.decision == "Approve" then
|
|
2988
|
-
Stage.set("promoting")
|
|
2989
|
-
|
|
2990
2897
|
local result = Step.checkpoint(function()
|
|
2991
2898
|
return plexus_promote_score_version.run({
|
|
2992
2899
|
score_id = input.score_id,
|
|
@@ -3000,7 +2907,6 @@ Procedure {
|
|
|
3000
2907
|
context = {version_id = result.version_id}
|
|
3001
2908
|
})
|
|
3002
2909
|
|
|
3003
|
-
Stage.set("complete")
|
|
3004
2910
|
return {
|
|
3005
2911
|
promoted = true,
|
|
3006
2912
|
new_version_id = result.version_id,
|
|
@@ -3015,7 +2921,6 @@ Procedure {
|
|
|
3015
2921
|
attempt = attempt + 1
|
|
3016
2922
|
|
|
3017
2923
|
else -- "Reject"
|
|
3018
|
-
Stage.set("complete")
|
|
3019
2924
|
return {
|
|
3020
2925
|
promoted = false,
|
|
3021
2926
|
improvement = improvement,
|
|
@@ -3025,7 +2930,6 @@ Procedure {
|
|
|
3025
2930
|
end
|
|
3026
2931
|
end
|
|
3027
2932
|
|
|
3028
|
-
Stage.set("complete")
|
|
3029
2933
|
return {promoted = false, rejection_reason = "max_attempts_exhausted"}
|
|
3030
2934
|
end
|
|
3031
2935
|
}
|
|
@@ -3228,7 +3132,7 @@ Tactus includes first-class support for behavior-driven testing using Gherkin sy
|
|
|
3228
3132
|
Write Gherkin specifications directly in procedure files:
|
|
3229
3133
|
|
|
3230
3134
|
```lua
|
|
3231
|
-
|
|
3135
|
+
Specification([[
|
|
3232
3136
|
Feature: Research Task Completion
|
|
3233
3137
|
As a user
|
|
3234
3138
|
I want the agent to research topics effectively
|
|
@@ -3240,11 +3144,6 @@ Feature: Research Task Completion
|
|
|
3240
3144
|
Then the search tool should be called at least once
|
|
3241
3145
|
And the done tool should be called exactly once
|
|
3242
3146
|
And the procedure should complete successfully
|
|
3243
|
-
|
|
3244
|
-
Scenario: Agent progresses through stages correctly
|
|
3245
|
-
Given the procedure has started
|
|
3246
|
-
When the procedure runs
|
|
3247
|
-
Then the stage should transition from researching to complete
|
|
3248
3147
|
And the total iterations should be less than 20
|
|
3249
3148
|
]])
|
|
3250
3149
|
```
|
|
@@ -3258,16 +3157,12 @@ The framework provides comprehensive built-in steps for Tactus primitives:
|
|
|
3258
3157
|
- `the {tool} tool should be called at least {n} times`
|
|
3259
3158
|
- `the {tool} tool should be called with {param}={value}`
|
|
3260
3159
|
|
|
3261
|
-
**Stage steps:**
|
|
3262
|
-
- `the procedure has started`
|
|
3263
|
-
- `the stage should be {stage}`
|
|
3264
|
-
- `the stage should transition from {stage1} to {stage2}`
|
|
3265
|
-
|
|
3266
3160
|
**State steps:**
|
|
3267
3161
|
- `the state {key} should be {value}`
|
|
3268
3162
|
- `the state {key} should exist`
|
|
3269
3163
|
|
|
3270
3164
|
**Completion steps:**
|
|
3165
|
+
- `the procedure has started`
|
|
3271
3166
|
- `the procedure should complete successfully`
|
|
3272
3167
|
- `the stop reason should contain {text}`
|
|
3273
3168
|
|