tactus 0.21.0__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.21.0 → tactus-0.21.1}/.github/workflows/release.yml +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/.gitignore +1 -0
- {tactus-0.21.0 → tactus-0.21.1}/CHANGELOG.md +31 -5
- {tactus-0.21.0 → tactus-0.21.1}/IMPLEMENTATION.md +23 -26
- {tactus-0.21.0 → tactus-0.21.1}/PKG-INFO +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/SPECIFICATION.md +11 -16
- {tactus-0.21.0 → tactus-0.21.1}/TECHNICAL_DEBT.md +14 -19
- {tactus-0.21.0 → tactus-0.21.1}/docs/DURABILITY.md +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/docs/TOOL_ROADMAP.md +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/01-basics-hello-world.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/05-basics-multi-model.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/examples/06-basics-streaming.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/07-basics-bedrock.tac +3 -3
- {tactus-0.21.0 → tactus-0.21.1}/examples/08-basics-models.tac +3 -3
- {tactus-0.21.0 → tactus-0.21.1}/examples/09-basics-google-gemini.tac +4 -4
- {tactus-0.21.0 → tactus-0.21.1}/examples/12-feature-structured-output.tac +17 -21
- {tactus-0.21.0 → tactus-0.21.1}/examples/15-feature-local-tools.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/16-feature-toolsets-advanced.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/examples/17-feature-toolsets-dsl.tac +2 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-individual.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-inline.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/18-feature-lua-tools-toolset.tac +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/examples/61-inline-toolset-lua.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/examples/62-mcp-toolset-by-server.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/examples/63-toolset-import-from-file.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/examples/99-misc-test-loading.tac +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/features/32_result_object.feature +6 -8
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/example_procedures_steps.py +5 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/result_and_output_steps.py +7 -7
- {tactus-0.21.0 → tactus-0.21.1}/pyproject.toml +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/tactus/__init__.py +1 -1
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/cli_log.py +25 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/registry.py +1 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/runtime.py +14 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/agent.py +219 -93
- tactus-0.21.1/tactus/ide/coding_assistant.py +343 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/ide/server.py +159 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/__init__.py +2 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/step.py +57 -0
- tactus-0.21.1/tactus/primitives/system.py +93 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/__init__.py +7 -0
- tactus-0.21.1/tactus/protocols/cost.py +31 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/log_handler.py +2 -2
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/models.py +15 -1
- tactus-0.21.1/tactus/protocols/result.py +33 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_agent.py +23 -8
- tactus-0.21.1/tactus-ide/frontend/src/components/ChatSidebar.tsx +195 -0
- 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.21.0/tmp/langchain.db/topics_llm_cache.db +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/.claude/agents.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/.github/workflows/desktop-release.yml +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/.tactus/config.yml.example +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/AGENTS.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/LICENSE +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/Makefile +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/SPECIFICATION.md.bak +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/behave.ini +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/AGENTS.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/BDD_TESTING.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/CONFIGURATION.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/FILE_IO.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/SANDBOXING.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/STREAMING.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/docs/TOOLS.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/.tactus/config.yml +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/02-basics-simple-logic.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/04-basics-simple-agent.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/10-feature-state.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/11-feature-message-history.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/13-feature-session.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/14-feature-per-turn-tools.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/19-feature-direct-tool-calls.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/20-bdd-complete.tac.bak2 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/21-bdd-passing.tac.bak2 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/30-eval-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/31-eval-demo.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/32-eval-success-rate.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/33-eval-thresholds.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/34-eval-dataset.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac.bak +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/35-eval-trace.tac.bak2 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/36-eval-advanced.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/37-eval-comprehensive.tac.bak2 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/39-model-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/40-mcp-test.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/40-model-text-classifier.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/41-model-pytorch.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/44-sub-procedure-composition.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/52-file-io-basics.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/53-tsv-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/54-json-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/55-parquet-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/56-hdf5-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/57-excel-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/58-text-file-io.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/60-tool-sources.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/64-require-modules.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/65-optional-state-demo.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/70-mocking-static.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/71-mocking-temporal.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/72-mocking-conditional.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/app_config.ini +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/data/sample.csv +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/demo_output.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/math_module.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/product.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/string_module.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/sum.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/inventory_summary.tsv +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/mock-config.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/models/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/output_summary.txt +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/tools/calculations.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/tools/data_analysis.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/tools/search.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/01_state_management.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/02_checkpointing.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/04_control_flow.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/05_tool_integration.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/06_retry_logic.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/07_file_operations.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/08_agent_primitives.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/09_workflow_execution.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/10_lua_integration.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/11_storage_backends.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/12_json_operations.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/13_logging.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/14_stage_and_step_tracking.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/15_procedure_calls.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/16_session_management.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/18_example_procedures.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/19_ide_server.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/20_parameters.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/21_outputs.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/23_prompts.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/27_default_settings.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/28_custom_prompts.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/29_execution_settings.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/30_session_filters.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/31_matchers.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/33_output_type.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/42_model_primitive.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/48_script_mode.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/52_dspy_signature.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/53_dspy_module.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/54_dspy_history.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/56_dspy_agent.feature +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/environment.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/human_in_the_loop_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/logging_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/mocking_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/session_management_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/stage_tracking_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/state_management_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/support/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/support/harnesses.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/scripts/convert_examples.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/start-web-ide.sh +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/cli_hitl.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/file_storage.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/ide_log.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/mcp.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/memory.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/adapters/plugins.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/http_backend.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/model_backend.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/app.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/config_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/dsl_stubs.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/exceptions.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/execution_context.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/lua_sandbox.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/mocking.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/output_validator.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/template_resolver.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/docker/Dockerfile +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/config.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/history.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/module.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/prediction.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/dspy/signature.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/ide/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/control.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/file.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/handles.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/human.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/json.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/log.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/message_history.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/model.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/procedure.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/retry.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/session.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/stage.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/state.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/tool.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/primitives/toolset.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/config.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/hitl.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/protocols/storage.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/base.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/bedrock.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/google.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/providers/openai.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/config.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/container_runner.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/docker_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/entrypoint.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/sandbox/protocol.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/loader.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/behave_integration.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/context.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/eval_models.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/evaluation_runner.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/evaluators.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/events.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/gherkin_parser.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_hitl.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/mock_tools.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/models.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/builtin.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/custom.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/steps/registry.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/testing/test_runner.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/tracing/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/error_listener.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/semantic_visitor.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus/validation/validator.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/.gitignore +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/package.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/scripts/build-backend.js +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/scripts/build-frontend.js +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/events.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/dev.sh +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/main.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/package-lock.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/package.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/postcss.config.js +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/App.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/main.tsx +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/events.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/vite.config.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/package.json +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/test_lua_tools_adapter.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/adapters/test_plugins.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/cli/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/cli/test_cli.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/conftest.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_config_manager.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_lua_sandbox_security.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/core/test_script_mode.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/dspy/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/fixtures/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/mocks/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/stdlib/test_require_python.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/test_mcp_integration.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/test_tracing.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/conftest.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_all_examples.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_e2e.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_integration.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_models.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/utils/__init__.py +0 -0
- {tactus-0.21.0 → tactus-0.21.1}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.21.0 → 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,26 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.21.1 (2026-01-10)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **ci**: Add --skip-existing to twine upload
|
|
10
|
+
([`7a1b369`](https://github.com/AnthusAI/Tactus/commit/7a1b369376ce68869b98f0faed877a52855b4459))
|
|
11
|
+
|
|
12
|
+
|
|
5
13
|
## v0.21.0 (2026-01-10)
|
|
6
14
|
|
|
7
15
|
### Bug Fixes
|
|
8
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
|
+
|
|
9
23
|
- Clarify summarization prompts are logged
|
|
10
|
-
([`
|
|
24
|
+
([`423b912`](https://github.com/AnthusAI/Tactus/commit/423b912c590cd7e9702a0e9dbb76288f26cdfd4a))
|
|
11
25
|
|
|
12
26
|
- Clarify template namespaces and rendering
|
|
13
|
-
([`
|
|
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))
|
|
14
34
|
|
|
15
35
|
- Remove incompatible tests and skip deprecated YAML test
|
|
16
|
-
([`
|
|
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))
|
|
17
40
|
|
|
18
41
|
- Support message alias for agent calls
|
|
19
|
-
([`
|
|
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))
|
|
20
46
|
|
|
21
47
|
### Chores
|
|
22
48
|
|
|
23
49
|
- Update .gitignore to include tmp/ directory
|
|
24
|
-
([`
|
|
50
|
+
([`1294360`](https://github.com/AnthusAI/Tactus/commit/1294360a261cec1ff8c35f8063ae2b652c340373))
|
|
25
51
|
|
|
26
52
|
|
|
27
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
|
}
|
|
@@ -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
|
```
|
|
@@ -3260,4 +3255,4 @@ Tests are executed using Behave programmatically with:
|
|
|
3260
3255
|
|
|
3261
3256
|
**Declarative + Imperative:** Declare HITL points in YAML for documentation, invoke them in Lua for control.
|
|
3262
3257
|
|
|
3263
|
-
**BDD Testing:** First-class Gherkin specifications with built-in steps, custom steps, parallel execution, and consistency evaluation.
|
|
3258
|
+
**BDD Testing:** First-class Gherkin specifications with built-in steps, custom steps, parallel execution, and consistency evaluation.
|
|
@@ -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
|
|
|
@@ -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?
|
|
@@ -45,7 +45,7 @@ Procedure {
|
|
|
45
45
|
if done.called() then
|
|
46
46
|
research = done.last_result() or "Task completed"
|
|
47
47
|
else
|
|
48
|
-
research = result.
|
|
48
|
+
research = tostring(result.value) or "Research not completed"
|
|
49
49
|
Log.warn("Researcher did not call done within max turns")
|
|
50
50
|
end
|
|
51
51
|
state.research = research
|
|
@@ -66,7 +66,7 @@ Procedure {
|
|
|
66
66
|
if done.called() then
|
|
67
67
|
summary = done.last_result() or "Task completed"
|
|
68
68
|
else
|
|
69
|
-
summary = result.
|
|
69
|
+
summary = tostring(result.value) or "Summary not completed"
|
|
70
70
|
Log.warn("Summarizer did not call done within max turns")
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -36,9 +36,9 @@ Procedure {
|
|
|
36
36
|
local response = haiku_assistant()
|
|
37
37
|
turn_count = turn_count + 1
|
|
38
38
|
|
|
39
|
-
-- Accumulate the response
|
|
40
|
-
if response.
|
|
41
|
-
response_text = response_text .. response.
|
|
39
|
+
-- Accumulate the response value from each turn using .value property
|
|
40
|
+
if response.value and response.value ~= "" then
|
|
41
|
+
response_text = response_text .. response.value
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
-- Safety check: exit if too many turns
|
|
@@ -137,8 +137,8 @@ Procedure {
|
|
|
137
137
|
local response = agent_ref()
|
|
138
138
|
turn_count = turn_count + 1
|
|
139
139
|
|
|
140
|
-
if response.
|
|
141
|
-
response_text = response_text .. response.
|
|
140
|
+
if response.value and response.value ~= "" then
|
|
141
|
+
response_text = response_text .. response.value
|
|
142
142
|
end
|
|
143
143
|
|
|
144
144
|
if turn_count >= max_turns then
|
|
@@ -175,7 +175,7 @@ Procedure {
|
|
|
175
175
|
local success, result = pcall(function(input)
|
|
176
176
|
local response = agent_ref()
|
|
177
177
|
return {
|
|
178
|
-
response = response.
|
|
178
|
+
response = response.value or "",
|
|
179
179
|
turns = 1,
|
|
180
180
|
success = true,
|
|
181
181
|
error = nil
|
|
@@ -56,8 +56,8 @@ Procedure {
|
|
|
56
56
|
pro_turns = pro_turns + 1
|
|
57
57
|
|
|
58
58
|
-- Accumulate the response text
|
|
59
|
-
if response.
|
|
60
|
-
pro_response = pro_response .. response.
|
|
59
|
+
if response.value and response.value ~= "" then
|
|
60
|
+
pro_response = pro_response .. response.value
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
-- Safety check
|
|
@@ -86,8 +86,8 @@ Procedure {
|
|
|
86
86
|
flash_turns = flash_turns + 1
|
|
87
87
|
|
|
88
88
|
-- Accumulate the response text
|
|
89
|
-
if response.
|
|
90
|
-
flash_response = flash_response .. response.
|
|
89
|
+
if response.value and response.value ~= "" then
|
|
90
|
+
flash_response = flash_response .. response.value
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
-- Safety check
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
-- Structured Output Demo
|
|
2
2
|
-- Demonstrates using output for structured data extraction
|
|
3
|
-
-- and accessing result.
|
|
3
|
+
-- and accessing result.value, result.usage
|
|
4
4
|
|
|
5
5
|
extractor = Agent {
|
|
6
6
|
provider = "openai",
|
|
7
7
|
model = "gpt-4o-mini",
|
|
8
|
-
system_prompt = [[You extract city information. Return ONLY
|
|
8
|
+
system_prompt = [[You extract city information. Return ONLY a JSON object with these fields:
|
|
9
9
|
- city: city name
|
|
10
10
|
- country: country name
|
|
11
11
|
- population: estimated population (number, optional)
|
|
@@ -32,30 +32,26 @@ Procedure {
|
|
|
32
32
|
function(input)
|
|
33
33
|
Log.info("Starting structured output demo", {query = input.query})
|
|
34
34
|
|
|
35
|
-
--
|
|
35
|
+
-- Agent returns a Result wrapper (not raw data)
|
|
36
36
|
local result = extractor()
|
|
37
37
|
|
|
38
|
-
--
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
-- If the agent result has message, log it
|
|
47
|
-
if result and result.message then
|
|
48
|
-
Log.info("Agent response", {message = result.message})
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
Log.info("Extracted city information", city_data)
|
|
38
|
+
-- Access structured data via result.value
|
|
39
|
+
Log.info("Extracted city information", {
|
|
40
|
+
city = result.value.city,
|
|
41
|
+
country = result.value.country,
|
|
42
|
+
population = result.value.population or "unknown"
|
|
43
|
+
})
|
|
52
44
|
|
|
53
|
-
--
|
|
54
|
-
|
|
45
|
+
-- Access token usage stats
|
|
46
|
+
Log.info("Token usage", {
|
|
47
|
+
prompt_tokens = result.usage.prompt_tokens,
|
|
48
|
+
completion_tokens = result.usage.completion_tokens,
|
|
49
|
+
total_tokens = result.usage.total_tokens
|
|
50
|
+
})
|
|
55
51
|
|
|
56
52
|
return {
|
|
57
|
-
city_data =
|
|
58
|
-
tokens_used =
|
|
53
|
+
city_data = result.value,
|
|
54
|
+
tokens_used = result.usage.total_tokens
|
|
59
55
|
}
|
|
60
56
|
end
|
|
61
57
|
}
|
|
@@ -103,7 +103,7 @@ Procedure {
|
|
|
103
103
|
turn_count = turn_count + 1
|
|
104
104
|
until done.called() or turn_count >= max_turns
|
|
105
105
|
|
|
106
|
-
local response = result.
|
|
106
|
+
local response = tostring(result.value)
|
|
107
107
|
Log.info(agent_name .. " response", {text = response})
|
|
108
108
|
return response
|
|
109
109
|
end
|
|
@@ -123,7 +123,7 @@ Procedure {
|
|
|
123
123
|
-- Test Agent 5: No tools (explicitly empty) - only needs 1 turn
|
|
124
124
|
Log.info("Testing Agent 5: No tools")
|
|
125
125
|
local observer_result = observer()
|
|
126
|
-
local observer_response = observer_result.
|
|
126
|
+
local observer_response = tostring(observer_result.value)
|
|
127
127
|
Log.info("Observer response", {text = observer_response})
|
|
128
128
|
|
|
129
129
|
return {
|
|
@@ -94,7 +94,8 @@ Procedure {
|
|
|
94
94
|
else
|
|
95
95
|
Log.warn("Agent did not call done within max turns")
|
|
96
96
|
return {
|
|
97
|
-
calculation_result = result
|
|
97
|
+
calculation_result = (result and result.value and tostring(result.value))
|
|
98
|
+
or "Agent did not complete",
|
|
98
99
|
completed = false
|
|
99
100
|
}
|
|
100
101
|
end
|
|
@@ -127,8 +127,8 @@ Procedure {
|
|
|
127
127
|
answer = reason
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
|
-
elseif result and result.
|
|
131
|
-
answer = result.
|
|
130
|
+
elseif result and result.value then
|
|
131
|
+
answer = tostring(result.value)
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
Log.info("Task completed", {result = answer, completed = completed})
|