tactus 0.20.1__tar.gz → 0.21.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tactus-0.20.1 → tactus-0.21.1}/.github/workflows/release.yml +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/.gitignore +2 -0
- {tactus-0.20.1 → tactus-0.21.1}/CHANGELOG.md +43 -3
- {tactus-0.20.1 → tactus-0.21.1}/IMPLEMENTATION.md +23 -26
- {tactus-0.20.1 → tactus-0.21.1}/PKG-INFO +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/SPECIFICATION.md +12 -17
- {tactus-0.20.1 → tactus-0.21.1}/TECHNICAL_DEBT.md +14 -19
- {tactus-0.20.1 → tactus-0.21.1}/docs/CONFIGURATION.md +133 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/DURABILITY.md +2 -2
- tactus-0.21.1/docs/SANDBOXING.md +499 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/TOOL_ROADMAP.md +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/examples/01-basics-hello-world.tac +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/examples/04-basics-simple-agent.tac +10 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/05-basics-multi-model.tac +19 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/06-basics-streaming.tac +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/examples/07-basics-bedrock.tac +13 -3
- {tactus-0.20.1 → tactus-0.21.1}/examples/08-basics-models.tac +49 -6
- {tactus-0.20.1 → tactus-0.21.1}/examples/09-basics-google-gemini.tac +22 -12
- {tactus-0.20.1 → tactus-0.21.1}/examples/11-feature-message-history.tac +8 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/12-feature-structured-output.tac +21 -20
- {tactus-0.20.1 → tactus-0.21.1}/examples/13-feature-session.tac +8 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/14-feature-per-turn-tools.tac +9 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/15-feature-local-tools.tac +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/examples/16-feature-toolsets-advanced.tac +44 -26
- {tactus-0.20.1 → tactus-0.21.1}/examples/17-feature-toolsets-dsl.tac +18 -3
- {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-individual.tac +14 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-inline.tac +14 -3
- {tactus-0.20.1 → tactus-0.21.1}/examples/18-feature-lua-tools-toolset.tac +14 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/19-feature-direct-tool-calls.tac +15 -5
- {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac +13 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac +10 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/31-eval-demo.tac +23 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/32-eval-success-rate.tac +23 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/33-eval-thresholds.tac +23 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/34-eval-dataset.tac +23 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac +30 -8
- {tactus-0.20.1 → tactus-0.21.1}/examples/36-eval-advanced.tac +10 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac +22 -6
- {tactus-0.20.1 → tactus-0.21.1}/examples/40-model-text-classifier.tac +31 -10
- {tactus-0.20.1 → tactus-0.21.1}/examples/41-model-pytorch.tac +32 -10
- {tactus-0.20.1 → tactus-0.21.1}/examples/44-sub-procedure-composition.tac +36 -37
- {tactus-0.20.1 → tactus-0.21.1}/examples/52-file-io-basics.tac +4 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/53-tsv-file-io.tac +4 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/54-json-file-io.tac +4 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/55-parquet-file-io.tac +4 -4
- {tactus-0.20.1 → tactus-0.21.1}/examples/56-hdf5-file-io.tac +9 -9
- {tactus-0.20.1 → tactus-0.21.1}/examples/57-excel-file-io.tac +7 -7
- {tactus-0.20.1 → tactus-0.21.1}/examples/58-text-file-io.tac +13 -13
- {tactus-0.20.1 → tactus-0.21.1}/examples/60-tool-sources.tac +17 -19
- {tactus-0.20.1 → tactus-0.21.1}/examples/61-inline-toolset-lua.tac +17 -14
- {tactus-0.20.1 → tactus-0.21.1}/examples/62-mcp-toolset-by-server.tac +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/examples/63-toolset-import-from-file.tac +18 -18
- {tactus-0.20.1 → tactus-0.21.1}/examples/65-optional-state-demo.tac +21 -13
- {tactus-0.20.1 → tactus-0.21.1}/examples/70-mocking-static.tac +10 -9
- {tactus-0.20.1 → tactus-0.21.1}/examples/71-mocking-temporal.tac +15 -15
- {tactus-0.20.1 → tactus-0.21.1}/examples/72-mocking-conditional.tac +10 -26
- {tactus-0.20.1 → tactus-0.21.1}/examples/99-misc-test-loading.tac +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/features/32_result_object.feature +6 -8
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/example_procedures_steps.py +5 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/result_and_output_steps.py +7 -7
- {tactus-0.20.1 → tactus-0.21.1}/pyproject.toml +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/tactus/__init__.py +1 -1
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/cli_log.py +25 -0
- tactus-0.21.1/tactus/adapters/http_callback_log.py +109 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/app.py +190 -5
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/config_manager.py +11 -1
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dsl_stubs.py +105 -20
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/execution_context.py +8 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/output_validator.py +3 -6
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/registry.py +26 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/runtime.py +87 -39
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/yaml_parser.py +11 -1
- tactus-0.21.1/tactus/docker/Dockerfile +57 -0
- tactus-0.21.1/tactus/docker/entrypoint.sh +68 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/agent.py +222 -93
- tactus-0.21.1/tactus/ide/coding_assistant.py +343 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/ide/server.py +443 -65
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/__init__.py +2 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/handles.py +11 -2
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/step.py +57 -0
- tactus-0.21.1/tactus/primitives/system.py +93 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/tool.py +2 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/tool_handle.py +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/__init__.py +7 -0
- tactus-0.21.1/tactus/protocols/cost.py +31 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/log_handler.py +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/models.py +15 -1
- tactus-0.21.1/tactus/protocols/result.py +33 -0
- tactus-0.21.1/tactus/sandbox/__init__.py +63 -0
- tactus-0.21.1/tactus/sandbox/config.py +121 -0
- tactus-0.21.1/tactus/sandbox/container_runner.py +391 -0
- tactus-0.21.1/tactus/sandbox/docker_manager.py +321 -0
- tactus-0.21.1/tactus/sandbox/entrypoint.py +186 -0
- tactus-0.21.1/tactus/sandbox/protocol.py +222 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/done.tac +3 -3
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/README.md +4 -0
- tactus-0.21.1/tactus/testing/mock_agent.py +223 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_tools.py +18 -7
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/test_runner.py +18 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/test_lsp_server.py +4 -4
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/package-lock.json +1471 -2095
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/App.tsx +92 -4
- tactus-0.21.1/tactus-ide/frontend/src/components/ChatSidebar.tsx +195 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +27 -1
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +31 -2
- tactus-0.21.1/tactus-ide/frontend/src/components/TestOptionsModal.tsx +185 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +6 -5
- tactus-0.21.1/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +194 -0
- tactus-0.21.1/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +95 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +2 -2
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +15 -21
- tactus-0.21.1/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +42 -0
- tactus-0.21.1/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +262 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +91 -16
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/events.ts +18 -1
- {tactus-0.20.1 → tactus-0.21.1}/tests/cli/test_cli.py +4 -2
- {tactus-0.20.1 → tactus-0.21.1}/tests/cli/test_cli_inputs.py +22 -11
- tactus-0.21.1/tests/primitives/test_checkpoint_primitive.py +48 -0
- tactus-0.21.1/tests/primitives/test_system_alert.py +73 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/test_mcp_integration.py +2 -5
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_all_examples.py +17 -16
- tactus-0.20.1/examples/app_config.json +0 -1
- tactus-0.20.1/examples/app_summary.json +0 -1
- tactus-0.20.1/examples/data_export.csv +0 -11
- tactus-0.20.1/examples/executive_summary.xlsx +0 -0
- tactus-0.20.1/examples/inventory.tsv +0 -6
- tactus-0.20.1/examples/output_high_performers.csv +0 -5
- tactus-0.20.1/examples/output_summary.json +0 -5
- tactus-0.20.1/examples/product_analysis.xlsx +0 -0
- tactus-0.20.1/examples/sales_analysis.xlsx +0 -0
- tactus-0.20.1/examples/sales_report.xlsx +0 -0
- tactus-0.20.1/examples/scientific_data.h5 +0 -0
- tactus-0.20.1/examples/sensor_data.parquet +0 -0
- tactus-0.20.1/examples/sensor_report.parquet +0 -0
- tactus-0.20.1/examples/sensor_summary.parquet +0 -0
- tactus-0.20.1/examples/status_report.md +0 -31
- tactus-0.20.1/examples/summary.json +0 -6
- tactus-0.20.1/tactus/testing/mock_agent.py +0 -179
- tactus-0.20.1/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -29
- tactus-0.20.1/tmp/langchain.db/topics_llm_cache.db +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/.claude/agents.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/.github/workflows/desktop-release.yml +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/.tactus/config.yml.example +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/AGENTS.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/LICENSE +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/Makefile +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/SPECIFICATION.md.bak +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/behave.ini +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/AGENTS.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/BDD_TESTING.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/FILE_IO.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/STREAMING.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/docs/TOOLS.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/.tactus/config.yml +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/02-basics-simple-logic.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/10-feature-state.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak2 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak2 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/30-eval-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac.bak +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/35-eval-trace.tac.bak2 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/39-model-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/40-mcp-test.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/64-require-modules.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/app_config.ini +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/data/sample.csv +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/demo_output.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/math_module.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/product.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/string_module.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/sum.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/inventory_summary.tsv +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/mock-config.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/models/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/output_summary.txt +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/tools/calculations.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/tools/data_analysis.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/tools/search.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/01_state_management.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/02_checkpointing.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/04_control_flow.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/05_tool_integration.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/06_retry_logic.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/07_file_operations.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/08_agent_primitives.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/09_workflow_execution.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/10_lua_integration.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/11_storage_backends.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/12_json_operations.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/13_logging.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/14_stage_and_step_tracking.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/15_procedure_calls.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/16_session_management.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/18_example_procedures.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/19_ide_server.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/20_parameters.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/21_outputs.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/23_prompts.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/27_default_settings.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/28_custom_prompts.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/29_execution_settings.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/30_session_filters.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/31_matchers.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/33_output_type.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/42_model_primitive.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/48_script_mode.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/52_dspy_signature.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/53_dspy_module.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/54_dspy_history.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/56_dspy_agent.feature +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/environment.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/logging_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/mocking_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/session_management_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/stage_tracking_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/state_management_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/support/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/support/harnesses.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/scripts/convert_examples.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/start-web-ide.sh +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/mcp.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/memory.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/adapters/plugins.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/http_backend.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/model_backend.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/exceptions.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/mocking.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/core/template_resolver.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/config.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/history.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/module.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/prediction.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/dspy/signature.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/ide/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/control.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/file.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/human.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/json.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/log.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/message_history.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/model.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/procedure.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/retry.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/session.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/stage.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/state.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/primitives/toolset.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/config.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/hitl.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/protocols/storage.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/base.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/bedrock.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/google.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/providers/openai.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/loader.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/behave_integration.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/context.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/eval_models.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/evaluators.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/events.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/models.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/builtin.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/tracing/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/error_listener.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/semantic_visitor.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus/validation/validator.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/.gitignore +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/package.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/events.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/dev.sh +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/package.json +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/cli/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/conftest.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_config_manager.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/core/test_script_mode.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/dspy/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/fixtures/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/mocks/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/test_tracing.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/conftest.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_e2e.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_integration.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_models.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/utils/__init__.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.20.1 → tactus-0.21.1}/tests/validation/__init__.py +0 -0
|
@@ -77,10 +77,10 @@ jobs:
|
|
|
77
77
|
semantic-release publish
|
|
78
78
|
|
|
79
79
|
- name: Publish to PyPI
|
|
80
|
-
if: success()
|
|
80
|
+
if: success() && hashFiles('dist/*') != ''
|
|
81
81
|
env:
|
|
82
82
|
TWINE_USERNAME: __token__
|
|
83
83
|
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
|
|
84
84
|
run: |
|
|
85
85
|
pip install twine
|
|
86
|
-
twine upload dist/*
|
|
86
|
+
twine upload --skip-existing dist/*
|
|
@@ -2,12 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
-
## v0.
|
|
5
|
+
## v0.21.1 (2026-01-10)
|
|
6
6
|
|
|
7
7
|
### Bug Fixes
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
([`
|
|
9
|
+
- **ci**: Add --skip-existing to twine upload
|
|
10
|
+
([`7a1b369`](https://github.com/AnthusAI/Tactus/commit/7a1b369376ce68869b98f0faed877a52855b4459))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v0.21.0 (2026-01-10)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- Add Checkpoint.exists and Checkpoint.get
|
|
18
|
+
([`d652411`](https://github.com/AnthusAI/Tactus/commit/d6524115dea8de42559b94a1f35309f7538958e7))
|
|
19
|
+
|
|
20
|
+
- Add System.alert primitive
|
|
21
|
+
([`18ece11`](https://github.com/AnthusAI/Tactus/commit/18ece114eea760e97b07a493b7ee13eb27034516))
|
|
22
|
+
|
|
23
|
+
- Clarify summarization prompts are logged
|
|
24
|
+
([`423b912`](https://github.com/AnthusAI/Tactus/commit/423b912c590cd7e9702a0e9dbb76288f26cdfd4a))
|
|
25
|
+
|
|
26
|
+
- Clarify template namespaces and rendering
|
|
27
|
+
([`a33a383`](https://github.com/AnthusAI/Tactus/commit/a33a3831fb335b81d1e3152f5feb6d24f436bdb8))
|
|
28
|
+
|
|
29
|
+
- Expose agent Result usage and history
|
|
30
|
+
([`7f41286`](https://github.com/AnthusAI/Tactus/commit/7f412860f94c79a442fc8e86365f71ddddc9b58f))
|
|
31
|
+
|
|
32
|
+
- Handle string input in agent __call__ method
|
|
33
|
+
([`4af6ad5`](https://github.com/AnthusAI/Tactus/commit/4af6ad590cacb116885ce60ca93656c092f01435))
|
|
34
|
+
|
|
35
|
+
- Remove incompatible tests and skip deprecated YAML test
|
|
36
|
+
([`f96f084`](https://github.com/AnthusAI/Tactus/commit/f96f0842ceffa8176329b5553096c39ff1ba15d1))
|
|
37
|
+
|
|
38
|
+
- Standardize on TactusResult.value and fix agent mock lookup
|
|
39
|
+
([`a4e02c0`](https://github.com/AnthusAI/Tactus/commit/a4e02c0699a40461a2d0476e1359216d02a82616))
|
|
40
|
+
|
|
41
|
+
- Support message alias for agent calls
|
|
42
|
+
([`9a2b817`](https://github.com/AnthusAI/Tactus/commit/9a2b817478acf5848dad346fa9d0f0dd1a78eb86))
|
|
43
|
+
|
|
44
|
+
- **ci**: Only run twine upload when dist files exist
|
|
45
|
+
([`d490f55`](https://github.com/AnthusAI/Tactus/commit/d490f5527c8588666ffcafa67d13e195815c2856))
|
|
46
|
+
|
|
47
|
+
### Chores
|
|
48
|
+
|
|
49
|
+
- Update .gitignore to include tmp/ directory
|
|
50
|
+
([`1294360`](https://github.com/AnthusAI/Tactus/commit/1294360a261cec1ff8c35f8063ae2b652c340373))
|
|
11
51
|
|
|
12
52
|
|
|
13
53
|
## v0.20.0 (2026-01-09)
|
|
@@ -741,9 +741,9 @@ Defines interface for HITL implementations.
|
|
|
741
741
|
|
|
742
742
|
**Specification**: Programmatic alerts from anywhere (not just procedures).
|
|
743
743
|
|
|
744
|
-
**Status**:
|
|
744
|
+
**Status**: ✅ **Implemented**
|
|
745
745
|
|
|
746
|
-
|
|
746
|
+
Implemented as a non-blocking primitive that emits a structured `SystemAlertEvent` via the configured `LogHandler` (CLI/IDE), with a fallback to standard Python logging when no handler is present.
|
|
747
747
|
|
|
748
748
|
#### Message Classification
|
|
749
749
|
|
|
@@ -1103,6 +1103,9 @@ Explicit checkpoints do **not** create suspend points. They simply persist curre
|
|
|
1103
1103
|
|
|
1104
1104
|
- ✅ `Checkpoint.clear_all()` - Clear all checkpoints (execution log)
|
|
1105
1105
|
- ✅ `Checkpoint.clear_after(position)` - Clear from position onwards
|
|
1106
|
+
- ✅ `Checkpoint.next_position()` - Get next checkpoint position
|
|
1107
|
+
- ✅ `Checkpoint.exists(position)` - Check whether a checkpoint exists
|
|
1108
|
+
- ✅ `Checkpoint.get(position)` - Get cached value (or nil)
|
|
1106
1109
|
|
|
1107
1110
|
**Usage**: Testing and debugging checkpoint replay behavior. These are utility functions for test scenarios, not for production use.
|
|
1108
1111
|
|
|
@@ -1181,35 +1184,30 @@ main = procedure("main", {
|
|
|
1181
1184
|
end)
|
|
1182
1185
|
```
|
|
1183
1186
|
|
|
1184
|
-
####
|
|
1185
|
-
|
|
1186
|
-
**Status**: ✅ **Fully Implemented**
|
|
1187
|
+
#### Result (`tactus/protocols/result.py`)
|
|
1187
1188
|
|
|
1188
|
-
|
|
1189
|
+
**Status**: ✅ **Implemented (DSPy)**
|
|
1189
1190
|
|
|
1190
|
-
|
|
1191
|
+
`Agent()` returns a standard `TactusResult` wrapper (instead of raw text).
|
|
1191
1192
|
|
|
1192
1193
|
**Features:**
|
|
1193
|
-
- ✅ `result.
|
|
1194
|
+
- ✅ `result.value` - Response value (string or structured data)
|
|
1194
1195
|
- ✅ `result.usage` - Token usage stats (prompt_tokens, completion_tokens, total_tokens)
|
|
1195
|
-
- ✅ `result.
|
|
1196
|
-
|
|
1197
|
-
|
|
1196
|
+
- ✅ `result.cost()` - Cost stats (total_cost, prompt_cost, completion_cost)
|
|
1197
|
+
|
|
1198
|
+
**Breaking change:** Access agent output via `result.value` (not `result.message` / `result.data`).
|
|
1198
1199
|
|
|
1199
|
-
**
|
|
1200
|
+
**Implementation locations:**
|
|
1201
|
+
- `tactus/dspy/agent.py` (`DSPyAgentHandle.__call__`)
|
|
1202
|
+
- `tactus/protocols/result.py` (`TactusResult`)
|
|
1203
|
+
- `tactus/protocols/cost.py` (`UsageStats`, `CostStats`)
|
|
1200
1204
|
|
|
1201
1205
|
**Example:**
|
|
1202
1206
|
```lua
|
|
1203
1207
|
local result = Agent()
|
|
1204
|
-
|
|
1205
|
-
-- Access response
|
|
1206
|
-
Log.info(result.data)
|
|
1207
|
-
|
|
1208
|
-
-- Access usage
|
|
1208
|
+
Log.info(result.value)
|
|
1209
1209
|
Log.info("Tokens", {total = result.usage.total_tokens})
|
|
1210
|
-
|
|
1211
|
-
-- Access messages
|
|
1212
|
-
local msgs = result.new_messages()
|
|
1210
|
+
Log.info("Cost", {total = result.cost().total_cost})
|
|
1213
1211
|
```
|
|
1214
1212
|
|
|
1215
1213
|
#### Structured Output (output_type)
|
|
@@ -1234,7 +1232,7 @@ agent("extractor", {
|
|
|
1234
1232
|
|
|
1235
1233
|
-- Agent automatically validates output against schema
|
|
1236
1234
|
local result = Extractor()
|
|
1237
|
-
Log.info(result.
|
|
1235
|
+
Log.info(result.value.city)
|
|
1238
1236
|
```
|
|
1239
1237
|
|
|
1240
1238
|
#### State Primitives
|
|
@@ -1756,9 +1754,9 @@ tactus evaluate procedure.tac --runs 10
|
|
|
1756
1754
|
- Only local context exists
|
|
1757
1755
|
- No AWS Lambda integration
|
|
1758
1756
|
|
|
1759
|
-
4. **System.alert()**
|
|
1760
|
-
-
|
|
1761
|
-
-
|
|
1757
|
+
4. **System.alert()** ✅
|
|
1758
|
+
- Non-blocking alerts via `System.alert()`
|
|
1759
|
+
- Emits structured `system_alert` events to log handlers (CLI/IDE)
|
|
1762
1760
|
|
|
1763
1761
|
5. **Async Procedure Spawning** ❌
|
|
1764
1762
|
- No `Procedure.spawn()` for async invocation
|
|
@@ -1825,7 +1823,6 @@ tactus/
|
|
|
1825
1823
|
│ ├── retry.py # RetryPrimitive
|
|
1826
1824
|
│ ├── file.py # FilePrimitive
|
|
1827
1825
|
│ ├── message_history.py # MessageHistoryPrimitive
|
|
1828
|
-
│ ├── result.py # ResultPrimitive
|
|
1829
1826
|
│ └── deps_generator.py # Dynamic AgentDeps generation [NEW]
|
|
1830
1827
|
│
|
|
1831
1828
|
├── backends/
|
|
@@ -1902,7 +1899,7 @@ To align the implementation with the specification:
|
|
|
1902
1899
|
### Medium Priority
|
|
1903
1900
|
4. **Inline Procedures** - Parse and support `procedures:` section in YAML
|
|
1904
1901
|
5. **Agent `prepare` hook** - Enable `prepared` template namespace
|
|
1905
|
-
6. **System.alert()** -
|
|
1902
|
+
6. **System.alert() integrations** - Route alerts to external monitoring
|
|
1906
1903
|
7. **Template variables** - Add `context`, `env`, `output` support
|
|
1907
1904
|
8. **More Model Backends** - BERT, scikit-learn, ONNX, SageMaker
|
|
1908
1905
|
|
|
@@ -356,13 +356,11 @@ This ensures type-safe, structured outputs from agents.
|
|
|
356
356
|
**Aligned with pydantic-ai:** The Result object wraps pydantic-ai's `RunResult` and provides Lua-accessible properties.
|
|
357
357
|
|
|
358
358
|
**Properties:**
|
|
359
|
-
- `result.
|
|
359
|
+
- `result.value` - The response value (string or structured data)
|
|
360
360
|
- `result.usage` - Token usage stats (prompt_tokens, completion_tokens, total_tokens)
|
|
361
361
|
|
|
362
362
|
**Methods:**
|
|
363
|
-
- `result.
|
|
364
|
-
- `result.all_messages()` - Full conversation history
|
|
365
|
-
- `result.cost()` - Token usage (same as .usage, for cost calculation)
|
|
363
|
+
- `result.cost()` - Cost statistics (total_cost, prompt_cost, completion_cost)
|
|
366
364
|
|
|
367
365
|
**Example:**
|
|
368
366
|
|
|
@@ -377,8 +375,8 @@ Procedure {
|
|
|
377
375
|
function(input)
|
|
378
376
|
local result = worker()
|
|
379
377
|
|
|
380
|
-
-- Access response
|
|
381
|
-
Log.info("Response", {
|
|
378
|
+
-- Access response value
|
|
379
|
+
Log.info("Response", {value = result.value})
|
|
382
380
|
|
|
383
381
|
-- Access token usage
|
|
384
382
|
Log.info("Tokens used", {
|
|
@@ -387,11 +385,6 @@ Procedure {
|
|
|
387
385
|
total = result.usage.total_tokens
|
|
388
386
|
})
|
|
389
387
|
|
|
390
|
-
-- Access messages
|
|
391
|
-
local messages = result.new_messages()
|
|
392
|
-
for i, msg in ipairs(messages) do
|
|
393
|
-
Log.info("Message", {role = msg.role, content = msg.content})
|
|
394
|
-
end
|
|
395
388
|
end
|
|
396
389
|
}
|
|
397
390
|
```
|
|
@@ -414,8 +407,8 @@ Procedure {
|
|
|
414
407
|
|
|
415
408
|
-- Access structured data fields
|
|
416
409
|
Log.info("Extracted", {
|
|
417
|
-
city = result.
|
|
418
|
-
country = result.
|
|
410
|
+
city = result.value.city,
|
|
411
|
+
country = result.value.country
|
|
419
412
|
})
|
|
420
413
|
end
|
|
421
414
|
}
|
|
@@ -1883,12 +1876,12 @@ local web_search = Tool.get("web_search") -- From MCP server
|
|
|
1883
1876
|
local result = web_search({query = "weather"})
|
|
1884
1877
|
```
|
|
1885
1878
|
|
|
1886
|
-
###
|
|
1879
|
+
### toolset() with type="lua"
|
|
1887
1880
|
|
|
1888
1881
|
Group multiple related tools into a named toolset:
|
|
1889
1882
|
|
|
1890
1883
|
```lua
|
|
1891
|
-
|
|
1884
|
+
toolset("math_tools", {
|
|
1892
1885
|
type = "lua",
|
|
1893
1886
|
tools = {
|
|
1894
1887
|
{
|
|
@@ -2197,6 +2190,8 @@ For testing and debugging:
|
|
|
2197
2190
|
Checkpoint.clear_all() -- Clear all checkpoints
|
|
2198
2191
|
Checkpoint.clear_after(position) -- Clear checkpoint at position and all after (position is a number)
|
|
2199
2192
|
Checkpoint.next_position() -- Get the next checkpoint position number
|
|
2193
|
+
Checkpoint.exists(position) -- Check if a checkpoint exists at a position
|
|
2194
|
+
Checkpoint.get(position) -- Get cached value at a position (or nil)
|
|
2200
2195
|
```
|
|
2201
2196
|
|
|
2202
2197
|
### Human Interaction Primitives
|
|
@@ -2477,9 +2472,9 @@ local error_matcher = contains("error")
|
|
|
2477
2472
|
|
|
2478
2473
|
-- Use in conditional logic
|
|
2479
2474
|
local result = worker()
|
|
2480
|
-
if result.
|
|
2475
|
+
if tostring(result.value):find("success") then
|
|
2481
2476
|
-- Contains success
|
|
2482
|
-
elseif result.
|
|
2477
|
+
elseif tostring(result.value):find("error") then
|
|
2483
2478
|
-- Contains error
|
|
2484
2479
|
end
|
|
2485
2480
|
```
|
|
@@ -77,37 +77,32 @@ These are minor features documented in the spec that could be implemented with s
|
|
|
77
77
|
|
|
78
78
|
### Checkpoint Inspection Methods
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```lua
|
|
83
|
-
Checkpoint.exists(name) -- Check if a checkpoint exists
|
|
84
|
-
Checkpoint.get(name) -- Get the cached value from a checkpoint
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**What exists:** `clear_all()`, `clear_after(position)`, `next_position()`
|
|
88
|
-
|
|
89
|
-
**Why it matters:** These would be useful for testing and debugging checkpoint behavior.
|
|
90
|
-
|
|
91
|
-
**Implementation location:** `tactus/primitives/step.py` CheckpointPrimitive class
|
|
80
|
+
Implemented in `tactus/primitives/step.py` (`Checkpoint.exists(position)`, `Checkpoint.get(position)`).
|
|
92
81
|
|
|
93
82
|
---
|
|
94
83
|
|
|
95
84
|
### Result Object with Usage Statistics
|
|
96
85
|
|
|
97
|
-
|
|
86
|
+
We want a standard Result object with response data + token usage + cost:
|
|
98
87
|
|
|
99
88
|
```lua
|
|
100
|
-
result.
|
|
101
|
-
result.
|
|
102
|
-
result.
|
|
103
|
-
result.cost() -- Cost calculation
|
|
89
|
+
result.value -- string or structured data
|
|
90
|
+
result.usage -- {prompt_tokens, completion_tokens, total_tokens}
|
|
91
|
+
result.cost() -- {total_cost, prompt_cost, completion_cost}
|
|
104
92
|
```
|
|
105
93
|
|
|
106
|
-
**What exists:** `
|
|
94
|
+
**What exists now:** `TactusResult` returned by `Agent()` (breaking change: use `result.value`)
|
|
95
|
+
|
|
96
|
+
**Intentionally not implemented (YAGNI for now):**
|
|
97
|
+
- `result.new_messages()`
|
|
98
|
+
- `result.all_messages()`
|
|
107
99
|
|
|
108
100
|
**Why it matters:** Users can't track token usage or costs per-call, which is important for optimization and budgeting.
|
|
109
101
|
|
|
110
|
-
**Implementation
|
|
102
|
+
**Implementation locations:**
|
|
103
|
+
- `tactus/dspy/agent.py`
|
|
104
|
+
- `tactus/protocols/result.py`
|
|
105
|
+
- `tactus/protocols/cost.py`
|
|
111
106
|
|
|
112
107
|
---
|
|
113
108
|
|
|
@@ -93,6 +93,138 @@ default_model: "gpt-4o-mini"
|
|
|
93
93
|
|
|
94
94
|
**Security**: Sidecar files can contain file paths and command execution. Only use trusted sidecar files.
|
|
95
95
|
|
|
96
|
+
## Sandbox Configuration
|
|
97
|
+
|
|
98
|
+
Tactus runs procedures in Docker containers by default for security isolation. You can configure sandbox behavior at any configuration level (user, project, or sidecar).
|
|
99
|
+
|
|
100
|
+
### Basic Sandbox Settings
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
# ~/.tactus/config.yml or .tactus/config.yml
|
|
104
|
+
sandbox:
|
|
105
|
+
enabled: true # Default: true (if Docker available)
|
|
106
|
+
image: "tactus-sandbox:local" # Docker image name (auto-built on first use)
|
|
107
|
+
timeout: 3600 # Max execution time in seconds (default: 1 hour)
|
|
108
|
+
mcp_servers_path: "~/.tactus/mcp-servers" # Path to MCP servers
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Note**: If Docker is unavailable and `enabled: true`, execution will fail with an error. Use `--no-sandbox` flag or `enabled: false` to explicitly run without isolation.
|
|
112
|
+
|
|
113
|
+
### Resource Limits
|
|
114
|
+
|
|
115
|
+
Control memory and CPU usage per container:
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
sandbox:
|
|
119
|
+
limits:
|
|
120
|
+
memory: "2g" # Per-container memory limit (default: 2GB)
|
|
121
|
+
cpus: "2" # Per-container CPU cores (default: 2)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Error handling**:
|
|
125
|
+
- Out of memory: Container killed with exit code 137
|
|
126
|
+
- Timeout exceeded: Container killed with exit code 124
|
|
127
|
+
|
|
128
|
+
### Network Configuration
|
|
129
|
+
|
|
130
|
+
Control network access for procedures:
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
sandbox:
|
|
134
|
+
network: "bridge" # Network mode (default: bridge)
|
|
135
|
+
|
|
136
|
+
# Options:
|
|
137
|
+
# - "bridge": Default Docker bridge (allows outbound connections)
|
|
138
|
+
# - "none": No network access (most secure, but can't call LLM APIs)
|
|
139
|
+
# - "host": Use host network (not recommended for security)
|
|
140
|
+
# - "custom-network": Use a custom Docker network
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Security consideration**: Default `bridge` mode allows outbound connections (needed for LLM API calls), but agents could potentially exfiltrate data. See [Sandboxing Guide: Threat Model](./SANDBOXING.md#threat-model) for details.
|
|
144
|
+
|
|
145
|
+
### Volume Mounts
|
|
146
|
+
|
|
147
|
+
Mount host directories into the container:
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
sandbox:
|
|
151
|
+
volumes:
|
|
152
|
+
- "/host/data:/data:ro" # Read-only mount
|
|
153
|
+
- "/host/outputs:/outputs:rw" # Read-write mount
|
|
154
|
+
- "/shared/config:/config:ro"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Default mounts** (always included):
|
|
158
|
+
- Workspace: Temporary directory at `/workspace` (ephemeral, destroyed after run)
|
|
159
|
+
- MCP Servers: `~/.tactus/mcp-servers` at `/mcp-servers` (read-only)
|
|
160
|
+
|
|
161
|
+
### Environment Variables
|
|
162
|
+
|
|
163
|
+
Pass environment variables to the container:
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
sandbox:
|
|
167
|
+
env:
|
|
168
|
+
CUSTOM_VAR: "value"
|
|
169
|
+
DEBUG: "true"
|
|
170
|
+
LOG_LEVEL: "info"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Automatically passed through** (no configuration needed):
|
|
174
|
+
- `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`
|
|
175
|
+
- `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_DEFAULT_REGION`, `AWS_SESSION_TOKEN`
|
|
176
|
+
- `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`
|
|
177
|
+
|
|
178
|
+
### Per-Procedure Sandbox Configuration
|
|
179
|
+
|
|
180
|
+
Use sidecar files to customize sandbox settings per procedure:
|
|
181
|
+
|
|
182
|
+
**Example**: `financial_analysis.tac.yml`
|
|
183
|
+
```yaml
|
|
184
|
+
# Procedure-specific sandbox configuration
|
|
185
|
+
sandbox:
|
|
186
|
+
enabled: true
|
|
187
|
+
|
|
188
|
+
limits:
|
|
189
|
+
memory: "4g" # More memory for data-heavy processing
|
|
190
|
+
cpus: "4" # More CPU cores
|
|
191
|
+
|
|
192
|
+
timeout: 1800 # 30 minute timeout
|
|
193
|
+
|
|
194
|
+
network: "none" # No network access for sensitive data
|
|
195
|
+
|
|
196
|
+
volumes:
|
|
197
|
+
- "/data/financial:/data:ro" # Read-only financial data
|
|
198
|
+
- "/output/reports:/reports:rw" # Write reports here
|
|
199
|
+
|
|
200
|
+
env:
|
|
201
|
+
DATA_PATH: "/data"
|
|
202
|
+
OUTPUT_PATH: "/reports"
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Use cases for per-procedure sandbox configs**:
|
|
206
|
+
- Higher resource limits for data-intensive procedures
|
|
207
|
+
- Network isolation for procedures handling sensitive data
|
|
208
|
+
- Custom volume mounts for specific data sources
|
|
209
|
+
- Procedure-specific environment variables
|
|
210
|
+
|
|
211
|
+
### Disabling the Sandbox
|
|
212
|
+
|
|
213
|
+
To run without Docker isolation:
|
|
214
|
+
|
|
215
|
+
**Via CLI**:
|
|
216
|
+
```bash
|
|
217
|
+
tactus run procedure.tac --no-sandbox
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Via configuration**:
|
|
221
|
+
```yaml
|
|
222
|
+
sandbox:
|
|
223
|
+
enabled: false
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Security warning**: Running without sandbox removes OS-level isolation. Only disable for trusted procedures or development. See [Sandboxing Guide](./SANDBOXING.md) for security implications.
|
|
227
|
+
|
|
96
228
|
### Directory-Level Configuration
|
|
97
229
|
|
|
98
230
|
You can place `.tactus/config.yml` files in any directory to configure settings for procedures in that directory and subdirectories.
|
|
@@ -322,6 +454,7 @@ api_key = config.get("openai_api_key")
|
|
|
322
454
|
|
|
323
455
|
## See Also
|
|
324
456
|
|
|
457
|
+
- [Sandboxing & Security](SANDBOXING.md) - Security concepts and threat models
|
|
325
458
|
- [Tool Roadmap](TOOL_ROADMAP.md) - Information about tool loading
|
|
326
459
|
- [README](../README.md) - General Tactus documentation
|
|
327
460
|
- [Examples](../examples/) - Example procedures with sidecar configs
|
|
@@ -1097,7 +1097,7 @@ class AgentPrimitive:
|
|
|
1097
1097
|
)
|
|
1098
1098
|
return {
|
|
1099
1099
|
"output": result.output,
|
|
1100
|
-
"messages": self.messages
|
|
1100
|
+
"messages": self.messages
|
|
1101
1101
|
}
|
|
1102
1102
|
```
|
|
1103
1103
|
|
|
@@ -1390,4 +1390,4 @@ result = await runtime.execute(
|
|
|
1390
1390
|
|
|
1391
1391
|
4. **Observability**: Integration with Logfire/OpenTelemetry for tracing?
|
|
1392
1392
|
|
|
1393
|
-
5. **Error recovery**: Retry policies, dead letter queues, manual intervention?
|
|
1393
|
+
5. **Error recovery**: Retry policies, dead letter queues, manual intervention?
|