tactus 0.33.0__tar.gz → 0.34.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tactus-0.33.0 → tactus-0.34.0}/.github/workflows/release.yml +3 -0
- {tactus-0.33.0 → tactus-0.34.0}/AGENTS.md +63 -0
- {tactus-0.33.0 → tactus-0.34.0}/CHANGELOG.md +120 -0
- tactus-0.34.0/CHANGES_SUMMARY.md +176 -0
- tactus-0.34.0/CHECKPOINT_RESUME_PLAN.md +255 -0
- tactus-0.34.0/CURRENT_STATUS_AND_NEXT_STEPS.md +161 -0
- tactus-0.34.0/DETERMINISTIC_REQUEST_ID_FIX.md +135 -0
- tactus-0.34.0/EXECUTION_TRACE.md +212 -0
- tactus-0.34.0/PHASE0_IPC_CHANNEL_COMPLETE.md +356 -0
- tactus-0.34.0/PHASE2_INTEGRATION_COMPLETE.md +256 -0
- tactus-0.34.0/PHASE3_IDE_HITL_INTEGRATION.md +288 -0
- {tactus-0.33.0 → tactus-0.34.0}/PKG-INFO +14 -2
- {tactus-0.33.0 → tactus-0.34.0}/README.md +2 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/CONFIGURATION.md +11 -2
- tactus-0.34.0/docs/CONTROL_LOOP_PHASE1_COMPLETE.md +304 -0
- tactus-0.34.0/docs/MANUAL_CHECKPOINT_TESTING.md +283 -0
- tactus-0.34.0/docs/OMNICHANNEL_HITL_PLAN.md +2151 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/SANDBOXING.md +3 -1
- tactus-0.34.0/docs/archive/CHECKPOINT_RESUME_STATUS.md +187 -0
- tactus-0.34.0/docs/archive/CHECKPOINT_TESTING_PLAN.md +316 -0
- tactus-0.34.0/docs/archive/CONTROL_LOOP_INTEGRATION.md +569 -0
- tactus-0.34.0/docs/archive/HITL_CHECKPOINT_FIX_COMPLETE.md +161 -0
- tactus-0.34.0/docs/archive/HITL_FIX_SUMMARY.md +261 -0
- tactus-0.34.0/docs/archive/LLM_CHECKPOINTING_COMPLETE.md +228 -0
- tactus-0.34.0/docs_output/classify.html +489 -0
- tactus-0.34.0/docs_output/index.html +256 -0
- tactus-0.34.0/examples/90-hitl-debug.tac +20 -0
- tactus-0.34.0/examples/90-hitl-simple.tac +84 -0
- tactus-0.34.0/examples/90-hitl-test-simple.tac +18 -0
- tactus-0.34.0/examples/90-hitl-ultra-debug.tac +38 -0
- tactus-0.34.0/examples/90-super-simple.tac +9 -0
- tactus-0.34.0/examples/90-test-params.tac +17 -0
- tactus-0.34.0/examples/91-control-loop-demo.tac +100 -0
- tactus-0.34.0/examples/92-test-inputs-simple.tac +100 -0
- tactus-0.34.0/examples/92-test-inputs.tac +109 -0
- tactus-0.34.0/examples/92-test-multiple.tac +109 -0
- tactus-0.34.0/examples/93-test-ide-hitl.tac +61 -0
- tactus-0.34.0/examples/93-test-individual-hitl.tac +89 -0
- tactus-0.34.0/examples/93-test-input-summary.tac +49 -0
- tactus-0.34.0/examples/94-test-custom-components.tac +69 -0
- tactus-0.34.0/examples/95-agent-hitl.tac +150 -0
- tactus-0.34.0/examples/agent_test.tac +22 -0
- tactus-0.34.0/examples/classify_test.tac +34 -0
- tactus-0.34.0/examples/fuzzy_matching_demo.tac +308 -0
- tactus-0.34.0/examples/fuzzy_matching_demo_simple_spec.tac +77 -0
- tactus-0.34.0/examples/fuzzy_simple_test.tac +63 -0
- tactus-0.34.0/examples/hitl_toolset.lua +34 -0
- tactus-0.34.0/examples/llm_classify_binary.tac +94 -0
- tactus-0.34.0/examples/llm_classify_multiclass.tac +98 -0
- tactus-0.34.0/examples/llm_classify_with_metadata.tac +102 -0
- tactus-0.34.0/examples/test-resume-basic.tac +33 -0
- tactus-0.34.0/examples/test-resume-hitl-types.tac +73 -0
- tactus-0.34.0/examples/test-resume-llm.tac +52 -0
- tactus-0.34.0/examples/test-resume-many-checkpoints.tac +48 -0
- tactus-0.34.0/examples/test-resume-mixed.tac +110 -0
- tactus-0.34.0/examples/test-resume-multi-hitl.tac +53 -0
- tactus-0.34.0/examples/test-resume-timeout.tac +38 -0
- tactus-0.34.0/examples/test-temperature-multi-calls.tac +34 -0
- tactus-0.34.0/examples/test-temperature-variation.tac +10 -0
- tactus-0.34.0/features/61_classify_primitive.feature +193 -0
- tactus-0.34.0/features/61_cli_run_exit_codes.feature +10 -0
- tactus-0.34.0/features/steps/classify_primitive_steps.py +420 -0
- tactus-0.34.0/features/steps/cli_run_steps.py +38 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/human_in_the_loop_steps.py +3 -1
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/support/harnesses.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/pyproject.toml +17 -2
- {tactus-0.33.0 → tactus-0.34.0}/tactus/__init__.py +1 -1
- tactus-0.34.0/tactus/adapters/__init__.py +26 -0
- tactus-0.34.0/tactus/adapters/broker_log.py +169 -0
- tactus-0.34.0/tactus/adapters/channels/__init__.py +153 -0
- tactus-0.34.0/tactus/adapters/channels/base.py +174 -0
- tactus-0.34.0/tactus/adapters/channels/broker.py +179 -0
- tactus-0.34.0/tactus/adapters/channels/cli.py +448 -0
- tactus-0.34.0/tactus/adapters/channels/host.py +225 -0
- tactus-0.34.0/tactus/adapters/channels/ipc.py +297 -0
- tactus-0.34.0/tactus/adapters/channels/sse.py +305 -0
- tactus-0.34.0/tactus/adapters/cli_hitl.py +411 -0
- tactus-0.34.0/tactus/adapters/control_loop.py +879 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/file_storage.py +35 -2
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/ide_log.py +7 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/backends/http_backend.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/broker/client.py +31 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/broker/server.py +416 -92
- {tactus-0.33.0 → tactus-0.34.0}/tactus/cli/app.py +270 -7
- tactus-0.34.0/tactus/cli/control.py +393 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/config_manager.py +33 -6
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/dsl_stubs.py +102 -18
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/execution_context.py +265 -8
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/lua_sandbox.py +8 -9
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/registry.py +19 -2
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/runtime.py +235 -27
- tactus-0.34.0/tactus/docker/Dockerfile.pypi +49 -0
- tactus-0.34.0/tactus/docs/__init__.py +33 -0
- tactus-0.34.0/tactus/docs/extractor.py +326 -0
- tactus-0.34.0/tactus/docs/html_renderer.py +72 -0
- tactus-0.34.0/tactus/docs/models.py +121 -0
- tactus-0.34.0/tactus/docs/templates/base.html +204 -0
- tactus-0.34.0/tactus/docs/templates/index.html +58 -0
- tactus-0.34.0/tactus/docs/templates/module.html +96 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/agent.py +382 -22
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/broker_lm.py +57 -6
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/config.py +14 -3
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/history.py +2 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/module.py +136 -11
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/signature.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/ide/server.py +300 -9
- tactus-0.34.0/tactus/primitives/human.py +914 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/system.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/__init__.py +25 -0
- tactus-0.34.0/tactus/protocols/control.py +427 -0
- tactus-0.34.0/tactus/protocols/notification.py +207 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/container_runner.py +79 -11
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/docker_manager.py +23 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/entrypoint.py +26 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/protocol.py +3 -0
- tactus-0.34.0/tactus/stdlib/README.md +77 -0
- tactus-0.34.0/tactus/stdlib/__init__.py +36 -0
- tactus-0.34.0/tactus/stdlib/classify/__init__.py +165 -0
- tactus-0.34.0/tactus/stdlib/classify/classify.spec.tac +195 -0
- tactus-0.34.0/tactus/stdlib/classify/classify.tac +257 -0
- tactus-0.34.0/tactus/stdlib/classify/fuzzy.py +282 -0
- tactus-0.34.0/tactus/stdlib/classify/llm.py +319 -0
- tactus-0.34.0/tactus/stdlib/classify/primitive.py +287 -0
- tactus-0.34.0/tactus/stdlib/core/__init__.py +57 -0
- tactus-0.34.0/tactus/stdlib/core/base.py +320 -0
- tactus-0.34.0/tactus/stdlib/core/confidence.py +211 -0
- tactus-0.34.0/tactus/stdlib/core/models.py +161 -0
- tactus-0.34.0/tactus/stdlib/core/retry.py +171 -0
- tactus-0.34.0/tactus/stdlib/core/validation.py +274 -0
- tactus-0.34.0/tactus/stdlib/extract/__init__.py +125 -0
- tactus-0.34.0/tactus/stdlib/extract/llm.py +330 -0
- tactus-0.34.0/tactus/stdlib/extract/primitive.py +256 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify/base.tac +51 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify/fuzzy.tac +87 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify/index.md +77 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify/init.tac +29 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify/llm.tac +150 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/classify.spec.tac +191 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/extract/base.tac +138 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/extract/index.md +96 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/extract/init.tac +27 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/extract/llm.tac +201 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/extract.spec.tac +153 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/generate/base.tac +142 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/generate/index.md +195 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/generate/init.tac +28 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/generate/llm.tac +169 -0
- tactus-0.34.0/tactus/stdlib/tac/tactus/generate.spec.tac +210 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/behave_integration.py +171 -7
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/context.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/evaluation_runner.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/gherkin_parser.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/mock_hitl.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/mock_tools.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/models.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/steps/builtin.py +0 -1
- tactus-0.34.0/tactus/testing/steps/custom.py +128 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/steps/registry.py +0 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/test_runner.py +7 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/semantic_visitor.py +11 -5
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/validator.py +0 -1
- tactus-0.34.0/tactus-desktop/scripts/test-ci-build.sh +74 -0
- tactus-0.34.0/tactus-ide/frontend/.storybook/main.ts +29 -0
- tactus-0.34.0/tactus-ide/frontend/components.json +20 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/package-lock.json +109 -2
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/package.json +3 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/postcss.config.js +2 -11
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/App.tsx +22 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +18 -3
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +4 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +28 -1
- tactus-0.34.0/tactus-ide/frontend/src/components/ai-elements/confirmation.tsx +182 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +8 -4
- tactus-0.34.0/tactus-ide/frontend/src/components/chat/MessageInput.tsx +54 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +35 -63
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +12 -1
- tactus-0.34.0/tactus-ide/frontend/src/components/events/HITLEventComponent.stories.tsx +306 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/events/HITLEventComponent.tsx +388 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/registry.ts +178 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/builtin/ApprovalComponent.tsx +91 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/builtin/InputComponent.tsx +67 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/builtin/SelectComponent.tsx +63 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/builtin/index.ts +11 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/index.ts +8 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/selectors/ImageSelectorComponent.tsx +117 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/standard-library/selectors/index.ts +5 -0
- tactus-0.34.0/tactus-ide/frontend/src/components/hitl/types.ts +20 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +1 -1
- tactus-0.34.0/tactus-ide/frontend/src/components/ui/alert.tsx +59 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/button.tsx +1 -10
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +69 -32
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/main.tsx +1 -1
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/types/events.ts +131 -1
- tactus-0.34.0/tactus-ide/frontend/src/utils/clipboard.ts +17 -0
- tactus-0.34.0/tactus-ide/frontend/src/utils/runExport.ts +39 -0
- tactus-0.34.0/tactus-ide/frontend/tests/runExport.test.ts +52 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/tsconfig.json +3 -3
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/vite.config.ts +5 -3
- tactus-0.34.0/test_classify_loading.tac +44 -0
- tactus-0.34.0/test_run_inputs.sh +14 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/adapters/test_lua_tools_adapter.py +16 -32
- {tactus-0.33.0 → tactus-0.34.0}/tests/adapters/test_plugins.py +4 -8
- {tactus-0.33.0 → tactus-0.34.0}/tests/broker/test_broker_tcp_integration.py +3 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/broker/test_brokered_lm_unit.py +3 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/cli/test_cli.py +2 -4
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/test_lua_sandbox_security.py +6 -12
- {tactus-0.33.0 → tactus-0.34.0}/tests/sandbox/test_container_runner.py +2 -4
- {tactus-0.33.0 → tactus-0.34.0}/tests/sandbox/test_docker_sandbox_smoke.py +2 -4
- tactus-0.34.0/tests/stdlib/classify/__init__.py +1 -0
- tactus-0.34.0/tests/stdlib/classify/test_classify_primitive.py +436 -0
- tactus-0.34.0/tests/stdlib/classify/test_fuzzy_algorithms.py +174 -0
- tactus-0.34.0/tests/stdlib/classify/test_fuzzy_classifier.py +247 -0
- tactus-0.34.0/tests/stdlib/classify/test_fuzzy_demo.py +251 -0
- tactus-0.34.0/tests/stdlib/extract/__init__.py +1 -0
- tactus-0.34.0/tests/stdlib/extract/test_extract_primitive.py +377 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/stdlib/test_require_python.py +26 -52
- {tactus-0.33.0 → tactus-0.34.0}/tests/test_formatter.py +2 -8
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_all_examples.py +4 -1
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_e2e.py +2 -4
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_integration.py +1 -1
- tactus-0.33.0/tactus/adapters/__init__.py +0 -9
- tactus-0.33.0/tactus/adapters/broker_log.py +0 -76
- tactus-0.33.0/tactus/adapters/cli_hitl.py +0 -189
- tactus-0.33.0/tactus/primitives/human.py +0 -342
- tactus-0.33.0/tactus/stdlib/__init__.py +0 -10
- tactus-0.33.0/tactus/testing/steps/custom.py +0 -69
- tactus-0.33.0/tactus-ide/frontend/.storybook/main.ts +0 -16
- tactus-0.33.0/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -84
- {tactus-0.33.0 → tactus-0.34.0}/.claude/agents.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/.gitignore +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/.tactus/config.yml.example +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/IMPLEMENTATION.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/LICENSE +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/Makefile +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/SPECIFICATION.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/TECHNICAL_DEBT.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/behave.ini +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/AGENTS.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/BDD_TESTING.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/DURABILITY.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/FILE_IO.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/STREAMING.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/TOOLS.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/TOOL_ROADMAP.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/docs/development-mode.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/.tactus/config.yml +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/.tactus/config.yml.example +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/01-basics-hello-world.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/02-basics-simple-logic.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/03-basics-parameters.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/04-basics-simple-agent.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/05-basics-multi-model.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/06-basics-streaming.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/07-basics-bedrock.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/08-basics-models.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/09-basics-google-gemini.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/10-feature-state.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/11-feature-message-history.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/12-feature-structured-output.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/13-feature-session.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/14-feature-per-turn-tools-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/14-feature-per-turn-tools.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/15-feature-local-tools.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/16-feature-toolsets-advanced.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/17-feature-toolsets-dsl.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/18-feature-lua-tools-individual.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/18-feature-lua-tools-inline.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/18-feature-lua-tools-toolset.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/19-feature-direct-tool-calls.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/20-bdd-complete.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/21-bdd-passing.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/22-bdd-fuzzy-matching.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/30-eval-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/31-eval-demo.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/32-eval-success-rate.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/33-eval-thresholds.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/34-eval-dataset.jsonl +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/34-eval-dataset.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/35-eval-trace.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/36-eval-advanced.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/37-eval-comprehensive.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/39-model-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/40-mcp-test.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/40-model-text-classifier.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/41-mcp-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/41-model-pytorch.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/43-sub-procedure-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/44-sub-procedure-composition.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/45-sub-procedure-recursive.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/46-checkpoint-explicit.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/47-checkpoint-expensive-ops.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/48-script-mode-simple.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/50-inputs-showcase.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/51-inputs-calculator.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/52-file-io-basics.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/53-tsv-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/54-json-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/55-parquet-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/56-hdf5-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/57-excel-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/58-text-file-io.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/60-tool-sources.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/61-inline-toolset-lua.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/62-mcp-toolset-by-server.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/63-toolset-import-from-file.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/64-require-modules.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/65-optional-state-demo.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/66-host-tools-via-broker.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/67-host-tool-source.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/70-mocking-static.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/71-mocking-temporal.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/72-mocking-conditional.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/99-misc-test-loading.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/app_config.ini +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/data/sample.csv +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/demo_output.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/helpers/math_module.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/helpers/product.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/helpers/string_module.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/helpers/sum.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/helpers/text_tools.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/inventory_summary.tsv +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/mock-config.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/models/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/models/create_sentiment_model.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/output_summary.txt +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/test-raw-module.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/test-raw-streaming.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/tools/calculations.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/tools/data_analysis.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/tools/search.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/with_dependencies/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/with_dependencies/simple_http_test.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/examples/with_dependencies/time_lookup.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/01_state_management.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/02_checkpointing.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/03_human_in_the_loop.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/04_control_flow.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/05_tool_integration.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/06_retry_logic.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/07_file_operations.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/08_agent_primitives.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/09_workflow_execution.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/10_lua_integration.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/11_storage_backends.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/12_json_operations.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/13_logging.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/15_procedure_calls.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/16_session_management.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/17_lua_dsl_validation.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/18_example_procedures.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/19_ide_server.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/20_parameters.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/21_outputs.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/23_prompts.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/24_bdd_specifications.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/25_bdd_custom_steps.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/26_bdd_evaluation.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/27_default_settings.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/28_custom_prompts.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/29_execution_settings.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/30_session_filters.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/31_matchers.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/32_result_object.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/33_output_type.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/42_model_primitive.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/43_sub_procedure_checkpointing.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/46_explicit_checkpoint.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/48_script_mode.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/51_dspy_lm_config.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/52_dspy_signature.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/53_dspy_module.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/54_dspy_history.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/55_dspy_prediction.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/56_dspy_agent.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/57_chat_assistant.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/60_formatting.feature +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/documentation/Lua DSL/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/environment.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/agent_primitives_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/chat_assistant_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/checkpointing_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/control_flow_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_agent_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_history_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_lm_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_module_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_prediction_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/dspy_signature_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/example_procedures_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/file_operations_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/formatting_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/ide_server_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/json_operations_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/logging_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/lua_dsl_validation_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/lua_integration_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/mocking_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/procedure_calls_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/result_and_output_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/retry_logic_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/session_management_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/state_management_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/storage_backend_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/support/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/tool_integration_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/features/steps/workflow_execution_steps.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/planning/FORMATTER.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/scripts/audit_examples_mocking.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/scripts/convert_examples.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/scripts/run_precommit_suite.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/scripts/timeout.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/start-web-ide.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/cli_log.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/cost_collector_log.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/http_callback_log.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/lua_tools.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/mcp.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/mcp_manager.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/memory.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/adapters/plugins.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/backends/model_backend.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/backends/pytorch_backend.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/broker/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/broker/protocol.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/broker/stdio.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/cli/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/cli/commands/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/dependencies/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/dependencies/registry.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/exceptions.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/message_history_manager.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/mocking.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/output_validator.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/template_resolver.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/core/yaml_parser.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/docker/Dockerfile +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/docker/entrypoint.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/dspy/prediction.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/formatting/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/formatting/formatter.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/ide/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/ide/coding_assistant.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/ide/config_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/control.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/file.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/handles.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/host.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/json.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/log.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/message_history.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/model.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/procedure.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/procedure_callable.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/retry.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/session.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/state.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/step.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/tool.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/tool_handle.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/primitives/toolset.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/chat_recorder.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/config.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/cost.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/hitl.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/log_handler.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/models.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/result.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/protocols/storage.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/providers/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/providers/base.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/providers/bedrock.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/providers/google.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/providers/openai.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/sandbox/config.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/csv.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/excel.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/file.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/fs.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/hdf5.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/json.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/parquet.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/io/tsv.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/loader.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/eval_models.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/evaluators.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/events.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/mock_agent.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/mock_dependencies.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/mock_registry.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/pydantic_eval_runner.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/testing/steps/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/tracing/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/tracing/trace_manager.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/utils/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/utils/cost_calculator.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/utils/model_pricing.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/utils/safe_file_library.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/utils/safe_libraries.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/LuaLexerBase.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/LuaParserBase.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/error_listener.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaLexer.interp +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaLexer.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaParser.interp +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaParser.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaParserBase.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/generated/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/.gitignore +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/BUILD_GUIDE.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/DISTRIBUTION.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/backend/hook-lupa.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/package-lock.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/package.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/preload/preload.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/preload/tsconfig.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/rebuild-and-test.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/resources/app-icon.icns +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/resources/app-icon.ico +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/resources/app-icon.png +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/scripts/build-backend.mjs +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/scripts/build-frontend.mjs +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/src/backend-manager.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/src/main.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/src/menu.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/src/preferences-window.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-desktop/tsconfig.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/ARCHITECTURE.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/CHANGELOG.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/DEV_MODE.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/QUICK_START.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/assistant_service.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/assistant_tools.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/chat_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/config_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/events.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/logging_capture.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/lsp_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/requirements.txt +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/test_lsp_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/backend/text_editor_tool.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/dev.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/README.md +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/demo.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/index.html +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/jest.config.js +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/AuthErrorDialog.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/index.css +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/types/results.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/tailwind.config.js +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/package.json +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tactus-ide/start-dev.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/test-ci.sh +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/adapters/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/broker/test_broker_host_tool_source.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/broker/test_broker_integration.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/broker/test_broker_tcp_unit.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/cli/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/cli/test_cli_inputs.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/conftest.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/test_config_manager.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/test_determinism_safety.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/test_runtime_inputs.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/core/test_script_mode.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/dspy/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/dspy/test_mock_field_normalization.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/dspy/test_module_parameter.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/dspy/test_prediction_messages.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/dspy/test_streaming.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/fixtures/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/fixtures/brave_search_mcp_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/fixtures/filesystem_mcp_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/fixtures/test_mcp_server.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/integration/test_named_procedures.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/mocks/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/mocks/llm_mocks.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_host_primitive.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_retry_primitive.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_state_primitive.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_system_alert.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_tool_primitive.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/primitives/test_toolset_dsl.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/stdlib/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/stdlib/test_loader.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/test_checkpoints_integration.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/test_mcp_integration.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/test_tracing.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/conftest.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_gherkin_parser.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_models.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_runtime_integration.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/testing/test_step_registry.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/utils/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/utils/test_safe_file_library.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/validation/__init__.py +0 -0
- {tactus-0.33.0 → tactus-0.34.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
|
@@ -2,6 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
This document provides guidelines for AI coding agents working on the Tactus project.
|
|
4
4
|
|
|
5
|
+
## Brand Theme & Visual Design Policies
|
|
6
|
+
|
|
7
|
+
* **Flat Design Only**:
|
|
8
|
+
* No gradients.
|
|
9
|
+
* No drop-shadows (unless totally flat/hard).
|
|
10
|
+
* No borders/outlines on containers or regions.
|
|
11
|
+
* **Contrast & Separation**:
|
|
12
|
+
* Avoid thin lines (hrules, borders) for separating regions.
|
|
13
|
+
* Use **varying background colors** on flat rectangles with rounded corners to indicate regions and groupings.
|
|
14
|
+
* Use contrast carefully; avoid high contrast.
|
|
15
|
+
* Background black should not be fully black (e.g., use dark gray).
|
|
16
|
+
* Foreground white should not be fully white.
|
|
17
|
+
* Use a limited set of official colors: "not-black", "not-white", and 2-3 "muted" colors.
|
|
18
|
+
* **Color System**:
|
|
19
|
+
* Themes use **Radix Colors** (Cool, Neutral, Warm).
|
|
20
|
+
* Support both Light and Dark modes.
|
|
21
|
+
* **Typography & Layout**:
|
|
22
|
+
* Refined elegance, modern Bauhaus-inspired, Apple's modern minimalist Art Deco.
|
|
23
|
+
* **Animations**:
|
|
24
|
+
* Subtle animation effects are encouraged.
|
|
25
|
+
* **NO CSS animations** (like Framer Motion) for components that feature in Babulus videos.
|
|
26
|
+
* Use **frame-parameterized animations**: Animations must be driven by a `frame` parameter so they can be rendered deterministically in videos.
|
|
27
|
+
* **Development Workflow**:
|
|
28
|
+
* Refer to **Shadcn UI** for default UX design patterns.
|
|
29
|
+
* Provide examples of basic visual elements in **Storybook stories**.
|
|
30
|
+
* Do research into best practices for specific tasks.
|
|
31
|
+
|
|
5
32
|
## Pre-Commit Checklist
|
|
6
33
|
|
|
7
34
|
**CRITICAL**: Before committing any changes, you MUST:
|
|
@@ -47,6 +74,13 @@ Do not skip this step or commit before getting approval and running these checks
|
|
|
47
74
|
- **Multiple models**: Different agents can use different models (e.g., GPT-4o, GPT-4o-mini, Claude 3.5 Sonnet)
|
|
48
75
|
- **Model parameters**: Supports model-specific parameters like `temperature`, `max_tokens`, `openai_reasoning_effort`
|
|
49
76
|
|
|
77
|
+
**Provider-Specific Dependencies**:
|
|
78
|
+
- **DO NOT add provider-specific SDK dependencies** (e.g., `openai`, `anthropic`, etc.) unless there is a SPECIFIC reason
|
|
79
|
+
- Tactus uses **LiteLLM (via DSPy)** for ALL LLM calls, which provides unified multi-provider support
|
|
80
|
+
- LiteLLM handles all provider-specific API calls internally
|
|
81
|
+
- Adding provider SDKs creates maintenance burden and can lead to bugs where code bypasses the LiteLLM layer
|
|
82
|
+
- Exception: `boto3` is needed for Bedrock support, but all actual LLM calls still go through LiteLLM
|
|
83
|
+
|
|
50
84
|
Example:
|
|
51
85
|
```lua
|
|
52
86
|
-- Tool definition
|
|
@@ -213,8 +247,34 @@ Only rebuild when:
|
|
|
213
247
|
|
|
214
248
|
**Never rebuild for regular code changes** - that's what dev mode prevents.
|
|
215
249
|
|
|
250
|
+
### CRITICAL: Auto-Rebuild on Code Changes
|
|
251
|
+
|
|
252
|
+
**IMPORTANT**: The sandbox automatically rebuilds when it detects changes to core Tactus files. The hash includes:
|
|
253
|
+
- `tactus/dspy/` - DSPy integration
|
|
254
|
+
- `tactus/adapters/` - Adapters
|
|
255
|
+
- `tactus/broker/` - Broker client (used by sandbox for API calls)
|
|
256
|
+
- `tactus/core/` - Core runtime
|
|
257
|
+
- `tactus/primitives/` - Primitives
|
|
258
|
+
- `tactus/sandbox/` - Sandbox infrastructure
|
|
259
|
+
- `tactus/stdlib/` - Standard library
|
|
260
|
+
- `tactus/docker/` - Docker configuration
|
|
261
|
+
- `pyproject.toml` - Dependencies
|
|
262
|
+
|
|
263
|
+
**Common Pitfall**: When you make changes to these files (especially `tactus/broker/client.py`), the sandbox image is automatically rebuilt on the next `tactus run` command. However, AI agents often forget this and run tests with outdated containers, leading to confusing errors like:
|
|
264
|
+
- `TypeError: BrokerClient.llm_chat() got an unexpected keyword argument 'tools'`
|
|
265
|
+
- New parameters not being recognized
|
|
266
|
+
- Changes seemingly not taking effect
|
|
267
|
+
|
|
268
|
+
**Solution**: After making changes to any of the above paths, the next `tactus run` will automatically rebuild the sandbox image with your new code. Just wait for the rebuild to complete before declaring victory. Look for log lines indicating the build is happening.
|
|
269
|
+
|
|
216
270
|
See [docs/development-mode.md](docs/development-mode.md) for complete details.
|
|
217
271
|
|
|
272
|
+
### Docker Sandbox Defaults (CLI)
|
|
273
|
+
|
|
274
|
+
- The CLI requires Docker sandboxing by default. If Docker is unavailable, `tactus run` should error rather than silently running without isolation.
|
|
275
|
+
- Easy opt-out is explicit: `--no-sandbox` or `sandbox.enabled: false`.
|
|
276
|
+
- For PyPI installs without a local source tree, the sandbox image builds by installing the matching Tactus version from PyPI inside the container.
|
|
277
|
+
|
|
218
278
|
## Tactus IDE Development
|
|
219
279
|
|
|
220
280
|
When working on the Tactus IDE:
|
|
@@ -293,6 +353,9 @@ The IDE is designed to run as a desktop application:
|
|
|
293
353
|
When working on the Tactus IDE frontend:
|
|
294
354
|
|
|
295
355
|
- **UI Framework**: Use [Shadcn UI](https://ui.shadcn.com/) components for all UI elements
|
|
356
|
+
- **AI Components**: Use [AI SDK Elements](https://ai-sdk.dev/elements) components by default for AI-related UI patterns
|
|
357
|
+
- Confirmation dialogs: Use the [Confirmation component](https://ai-sdk.dev/elements/components/confirmation) pattern
|
|
358
|
+
- Follow AI SDK Elements patterns for conversational interfaces, prompts, and responses
|
|
296
359
|
- **Icons**: Always use [Lucide React](https://lucide.dev/) icons - **NEVER use emojis**
|
|
297
360
|
- **Styling**: Use Tailwind CSS with the existing design system
|
|
298
361
|
- **Theme**: Support both light and dark modes (colors are defined in CSS variables)
|
|
@@ -2,6 +2,126 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v0.34.0 (2026-01-25)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Address ruff warnings
|
|
10
|
+
([`8523ff0`](https://github.com/AnthusAI/Tactus/commit/8523ff0fb54a3cc961869cb243c27efca84fcd9b))
|
|
11
|
+
|
|
12
|
+
- Clarify sandbox defaults and CLI failures
|
|
13
|
+
([`1bdc1d9`](https://github.com/AnthusAI/Tactus/commit/1bdc1d9a5d9552a1972845646248746f2dfa35e6))
|
|
14
|
+
|
|
15
|
+
- Enable agent tool calling with DSPy native function calling
|
|
16
|
+
([`a76ea99`](https://github.com/AnthusAI/Tactus/commit/a76ea99d79732f6e39e242e733c3918cf7aca76c))
|
|
17
|
+
|
|
18
|
+
- Enable mocks for custom steps
|
|
19
|
+
([`b777f6b`](https://github.com/AnthusAI/Tactus/commit/b777f6b033f297ef6dc5ceae262a41b56d11b680))
|
|
20
|
+
|
|
21
|
+
- Enable real-time streaming for IDE agent responses
|
|
22
|
+
([`55266d7`](https://github.com/AnthusAI/Tactus/commit/55266d7b840bfa52121ec76a8353dd8d074f9760))
|
|
23
|
+
|
|
24
|
+
- Enforce sandbox defaults and PyPI image build
|
|
25
|
+
([`af17c15`](https://github.com/AnthusAI/Tactus/commit/af17c15d384cc475cb5128fcf0776eba522880ba))
|
|
26
|
+
|
|
27
|
+
- Make Classify primitive deterministic in BDD
|
|
28
|
+
([`0c58e55`](https://github.com/AnthusAI/Tactus/commit/0c58e554b46653abfa834d1a536ac964290428f4))
|
|
29
|
+
|
|
30
|
+
- Mock LLM classify examples in BDD
|
|
31
|
+
([`8277d3e`](https://github.com/AnthusAI/Tactus/commit/8277d3e99f8612bf3d65447ebe451f75337da715))
|
|
32
|
+
|
|
33
|
+
- Pass mock manager into BDD runtime context
|
|
34
|
+
([`76fd440`](https://github.com/AnthusAI/Tactus/commit/76fd4408e9afc58bf9c3116b25605f7ac0d30d89))
|
|
35
|
+
|
|
36
|
+
- Register generate agent mocks
|
|
37
|
+
([`6faf28c`](https://github.com/AnthusAI/Tactus/commit/6faf28c9f289eb45b633ae11d8a0e02311023c74))
|
|
38
|
+
|
|
39
|
+
- Stabilize stdlib generate specs
|
|
40
|
+
([`e6a00cb`](https://github.com/AnthusAI/Tactus/commit/e6a00cb494756ff5eeb07f3b55ec1a8e875a06ba))
|
|
41
|
+
|
|
42
|
+
- Update dependencies and improve CI configuration
|
|
43
|
+
([`a063fa5`](https://github.com/AnthusAI/Tactus/commit/a063fa59272e2192305c8a7806185f8fcb0bcafd))
|
|
44
|
+
|
|
45
|
+
- Update MockHITLHandler to accept execution_context parameter
|
|
46
|
+
([`14cd888`](https://github.com/AnthusAI/Tactus/commit/14cd888a4a6cdd05457158cb904a07cb14df4bb8))
|
|
47
|
+
|
|
48
|
+
### Chores
|
|
49
|
+
|
|
50
|
+
- Report stdlib scenario failures
|
|
51
|
+
([`7aa5093`](https://github.com/AnthusAI/Tactus/commit/7aa5093a7e98c217e32c3483d39e7d44820c24da))
|
|
52
|
+
|
|
53
|
+
### Code Style
|
|
54
|
+
|
|
55
|
+
- Apply black 26.1.0 formatting
|
|
56
|
+
([`d189f41`](https://github.com/AnthusAI/Tactus/commit/d189f4121ead45b4bb44599a9def9c40ef7c1983))
|
|
57
|
+
|
|
58
|
+
### Documentation
|
|
59
|
+
|
|
60
|
+
- Add brand theme and visual design policies
|
|
61
|
+
([`ca2ea2d`](https://github.com/AnthusAI/Tactus/commit/ca2ea2d388179b5bea4d4a4650b896d20fa7f974))
|
|
62
|
+
|
|
63
|
+
- Comprehensive checkpoint/resume testing summary
|
|
64
|
+
([`54b9ec9`](https://github.com/AnthusAI/Tactus/commit/54b9ec998492ab31e6065a4ae3777b7d5f1ece59))
|
|
65
|
+
|
|
66
|
+
- Document LLM checkpointing implementation
|
|
67
|
+
([`3906604`](https://github.com/AnthusAI/Tactus/commit/3906604e7f887a4cfe2e4e6557162527b61382d0))
|
|
68
|
+
|
|
69
|
+
- Mark Phase 2 complete, ready for Phase 3 IDE/SSE channel
|
|
70
|
+
([`8db044e`](https://github.com/AnthusAI/Tactus/commit/8db044e111f1a5d348179c54fe3b24be515ea7d9))
|
|
71
|
+
|
|
72
|
+
- Mark Test 3 (LLM Checkpoint/Resume) complete
|
|
73
|
+
([`6eb0043`](https://github.com/AnthusAI/Tactus/commit/6eb00435039a2d37107579eb5ab4c3a07374a46c))
|
|
74
|
+
|
|
75
|
+
- Update checkpoint testing status - Test 2 complete
|
|
76
|
+
([`b5b4bd8`](https://github.com/AnthusAI/Tactus/commit/b5b4bd818aaeb84a766c58ce9b0403e70b2899b5))
|
|
77
|
+
|
|
78
|
+
- Update status to Phase 4 testing, remove emojis
|
|
79
|
+
([`1392959`](https://github.com/AnthusAI/Tactus/commit/139295971b2575f26e4ee41ac2e243f7d65a5c24))
|
|
80
|
+
|
|
81
|
+
### Features
|
|
82
|
+
|
|
83
|
+
- Add modal cancellation handling with reopen capability
|
|
84
|
+
([`392660c`](https://github.com/AnthusAI/Tactus/commit/392660ca4a693975bbc463e38e3323ed9e53113a))
|
|
85
|
+
|
|
86
|
+
- Complete IDE HITL integration with SSE channel
|
|
87
|
+
([`5bf5e41`](https://github.com/AnthusAI/Tactus/commit/5bf5e4106a90b291cf6d331cd43e6f6c0fd1c9d8))
|
|
88
|
+
|
|
89
|
+
- Complete Phase 2 runtime integration with rich metadata
|
|
90
|
+
([`b265eb9`](https://github.com/AnthusAI/Tactus/commit/b265eb9b2bbb9f9e79b990b1c7664b6e0a547407))
|
|
91
|
+
|
|
92
|
+
- Complete unified HITL component registry architecture
|
|
93
|
+
([`4005ae7`](https://github.com/AnthusAI/Tactus/commit/4005ae7baa70c6bba18c9b14fc57dfc05f0d4f4a))
|
|
94
|
+
|
|
95
|
+
- Enable real-time container HITL and event streaming
|
|
96
|
+
([`a6e49ff`](https://github.com/AnthusAI/Tactus/commit/a6e49ff2bac5cae149bd4595c632e6b0b4863250))
|
|
97
|
+
|
|
98
|
+
- Implement DSPy native tool calling with Pydantic AI toolsets
|
|
99
|
+
([`f061f37`](https://github.com/AnthusAI/Tactus/commit/f061f374babbb15aaa2ba145ebffd536f2c02f55))
|
|
100
|
+
|
|
101
|
+
- Implement inline rendering for batched HITL inputs with registry architecture
|
|
102
|
+
([`9b520ba`](https://github.com/AnthusAI/Tactus/commit/9b520ba242afd15f26f452c0d41a59e864cb7bbe))
|
|
103
|
+
|
|
104
|
+
- Implement LLM checkpointing for transparent durability
|
|
105
|
+
([`15c0139`](https://github.com/AnthusAI/Tactus/commit/15c0139028f1c9da7eb7900450113ccf37871e93))
|
|
106
|
+
|
|
107
|
+
- Transparent durability for HITL with checkpoint/resume
|
|
108
|
+
([`46a3791`](https://github.com/AnthusAI/Tactus/commit/46a3791d6e8c130eb29e156ef029de2bb9ad3ced))
|
|
109
|
+
|
|
110
|
+
- **stdlib**: Implement standard library with classify, extract, and generate modules
|
|
111
|
+
([`a274a1e`](https://github.com/AnthusAI/Tactus/commit/a274a1e4407ff07eb51ca16f60403b1b4757b522))
|
|
112
|
+
|
|
113
|
+
### Testing
|
|
114
|
+
|
|
115
|
+
- Add LLM checkpoint/resume test procedure
|
|
116
|
+
([`88e06e5`](https://github.com/AnthusAI/Tactus/commit/88e06e56f21cbefe8f03491a74f545514eb88796))
|
|
117
|
+
|
|
118
|
+
- Add Test 4 and Test 5 procedures
|
|
119
|
+
([`d181355`](https://github.com/AnthusAI/Tactus/commit/d181355b9e4233fb54e9894b3f109f8dcfdefb6b))
|
|
120
|
+
|
|
121
|
+
- Add Tests 6-8 procedures and manual testing guide
|
|
122
|
+
([`9c27030`](https://github.com/AnthusAI/Tactus/commit/9c270305fc73036e4bb180ddccaf5f6f8291da7a))
|
|
123
|
+
|
|
124
|
+
|
|
5
125
|
## v0.33.0 (2026-01-18)
|
|
6
126
|
|
|
7
127
|
### Documentation
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Summary of Changes: Plain Function main() Support
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Fixed HITL examples that use plain Lua `function main()` syntax instead of the DSL `Procedure { ... }` syntax. These examples were previously non-functional because the runtime didn't recognize or execute plain function definitions.
|
|
6
|
+
|
|
7
|
+
## Files Modified
|
|
8
|
+
|
|
9
|
+
### 1. [tactus/core/runtime.py](tactus/core/runtime.py)
|
|
10
|
+
|
|
11
|
+
#### Change A: Skip script mode transformation for named functions (Lines 2451-2454)
|
|
12
|
+
```python
|
|
13
|
+
# If there are named function definitions (function name()), don't transform.
|
|
14
|
+
# These are procedure definitions that will be explicitly called.
|
|
15
|
+
if re.search(r"(?m)^\s*(?:local\s+)?function\s+[A-Za-z_][A-Za-z0-9_]*\s*\(", source):
|
|
16
|
+
return source
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Why:** The script mode transformation was incorrectly wrapping files containing `function main()` definitions, causing the function to be defined inside a wrapper but never called.
|
|
20
|
+
|
|
21
|
+
#### Change B: Auto-register plain main() functions (Lines 2754-2781)
|
|
22
|
+
```python
|
|
23
|
+
# Auto-register plain function main() if it exists
|
|
24
|
+
#
|
|
25
|
+
# Some .tac files use plain Lua syntax: `function main() ... end`
|
|
26
|
+
# instead of the Procedure DSL syntax: `Procedure { function(input) ... end }`
|
|
27
|
+
#
|
|
28
|
+
# For these files, we need to explicitly check lua.globals() after execution
|
|
29
|
+
# and register any function named "main" as the main procedure.
|
|
30
|
+
#
|
|
31
|
+
# This allows both syntax styles to work:
|
|
32
|
+
# 1. DSL style (self-registering): Procedure { function(input) ... end }
|
|
33
|
+
# 2. Plain Lua style (auto-registered): function main() ... end
|
|
34
|
+
#
|
|
35
|
+
# The script mode transformation (in _maybe_transform_script_mode_source)
|
|
36
|
+
# is designed to skip files with named function definitions to avoid wrapping
|
|
37
|
+
# them incorrectly.
|
|
38
|
+
lua_globals = sandbox.lua.globals()
|
|
39
|
+
if "main" in lua_globals:
|
|
40
|
+
main_func = lua_globals["main"]
|
|
41
|
+
# Check if it's a function and not already registered
|
|
42
|
+
if callable(main_func) and "main" not in builder.registry.named_procedures:
|
|
43
|
+
logger.info("[AUTO_REGISTER] Found plain function main(), auto-registering as main procedure")
|
|
44
|
+
builder.register_named_procedure(
|
|
45
|
+
name="main",
|
|
46
|
+
lua_function=main_func,
|
|
47
|
+
input_schema={},
|
|
48
|
+
output_schema={},
|
|
49
|
+
state_schema={},
|
|
50
|
+
)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Why:** After executing the Lua file, we need to check if a `main` function was defined in the global scope and explicitly register it as a named procedure so `_execute_workflow()` can find and execute it.
|
|
54
|
+
|
|
55
|
+
#### Change C: Removed debug print statements (Lines 2334-2338, 2344, 2354, 2358, 2373, 2376)
|
|
56
|
+
Removed temporary debug prints added during investigation:
|
|
57
|
+
- `print(f"[DEBUG] self.registry = ...")`
|
|
58
|
+
- `print(f"[DEBUG] Registry exists, named_procedures = ...")`
|
|
59
|
+
- `print("[DEBUG] Found 'main' in named_procedures")`
|
|
60
|
+
- `print(f"[DEBUG] main_proc = ...")`
|
|
61
|
+
- `print("[DEBUG] Creating ProcedureCallable...")`
|
|
62
|
+
- `print(f"[DEBUG] Created main_callable: ...")`
|
|
63
|
+
- `print(f"[DEBUG] input_params = ...")`
|
|
64
|
+
- `print("[DEBUG] About to call main_callable()...")`
|
|
65
|
+
- `print(f"[DEBUG] main_callable() returned: ...")`
|
|
66
|
+
|
|
67
|
+
### 2. [tactus/core/execution_context.py](tactus/core/execution_context.py)
|
|
68
|
+
|
|
69
|
+
#### Change: Removed debug print statements (Lines 302, 306)
|
|
70
|
+
```python
|
|
71
|
+
# Removed:
|
|
72
|
+
# print(f"[DEBUG] wait_for_human: hitl={self.hitl}, type={type(self.hitl)}")
|
|
73
|
+
# print(f"[DEBUG] No HITL handler - returning default: {default_value}")
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 3. [tactus/primitives/procedure_callable.py](tactus/primitives/procedure_callable.py)
|
|
77
|
+
|
|
78
|
+
#### Change A: Removed debug print statements (Lines 95, 129-138, 149, 153)
|
|
79
|
+
```python
|
|
80
|
+
# Removed:
|
|
81
|
+
# print(f"[DEBUG PROC] Inside execute_procedure() for {self.name}")
|
|
82
|
+
# print(f"[DEBUG PROC] About to call procedure_function")
|
|
83
|
+
# print(f"[DEBUG PROC] self.procedure_function = {self.procedure_function}")
|
|
84
|
+
# print(f"[DEBUG PROC] type = {type(self.procedure_function)}")
|
|
85
|
+
# print(f"[DEBUG PROC] Trying to call with NO parameters...")
|
|
86
|
+
# print(f"[DEBUG PROC] NO-PARAM call returned: {result}")
|
|
87
|
+
# print(f"[DEBUG PROC] ERROR calling procedure_function: {e}")
|
|
88
|
+
# print(f"[DEBUG PROC] Converted to dict: {result}")
|
|
89
|
+
# print(f"[DEBUG PROC] Validation passed, returning: {result}")
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### Change B: Fixed function call to pass lua_params (Line 128)
|
|
93
|
+
```python
|
|
94
|
+
# Before (incorrect):
|
|
95
|
+
result = self.procedure_function()
|
|
96
|
+
|
|
97
|
+
# After (correct):
|
|
98
|
+
result = self.procedure_function(lua_params)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Why:** The Lua function `main(input)` expects a parameter. Even if the function doesn't use the input, we should still pass an empty table to match the expected signature.
|
|
102
|
+
|
|
103
|
+
## Documentation Files Created
|
|
104
|
+
|
|
105
|
+
1. **HITL_FIX_SUMMARY.md** - Comprehensive explanation of the problem, root cause, solution, and impact
|
|
106
|
+
2. **EXECUTION_TRACE.md** - Step-by-step trace of execution flow showing how the fix works
|
|
107
|
+
3. **CHANGES_SUMMARY.md** - This file, documenting all code changes
|
|
108
|
+
|
|
109
|
+
## Test Files Created
|
|
110
|
+
|
|
111
|
+
1. **test_full_flow.py** - Verifies Lupa can find and call plain function definitions
|
|
112
|
+
2. **test_transform_full.py** - Verifies script mode transformation is skipped for named functions
|
|
113
|
+
3. **test_auto_register.py** - Documents the auto-registration logic flow
|
|
114
|
+
|
|
115
|
+
## Impact
|
|
116
|
+
|
|
117
|
+
### ✅ What Now Works
|
|
118
|
+
|
|
119
|
+
- `examples/90-hitl-simple.tac` - Full HITL demo with approve/input/review
|
|
120
|
+
- `examples/90-super-simple.tac` - Minimal test case
|
|
121
|
+
- `examples/90-test-params.tac` - Parameter passing test
|
|
122
|
+
- Any .tac file using `function main()` syntax
|
|
123
|
+
|
|
124
|
+
### ✅ Backward Compatibility
|
|
125
|
+
|
|
126
|
+
- No breaking changes
|
|
127
|
+
- Existing DSL-style procedures continue to work unchanged
|
|
128
|
+
- This is purely a bug fix for previously non-working code
|
|
129
|
+
|
|
130
|
+
### ✅ Both Syntax Styles Supported
|
|
131
|
+
|
|
132
|
+
**DSL Style (unchanged):**
|
|
133
|
+
```lua
|
|
134
|
+
Procedure {
|
|
135
|
+
output = { result = field.string{required = true} },
|
|
136
|
+
function(input)
|
|
137
|
+
local approved = Human.approve({message = "Continue?"})
|
|
138
|
+
return {result = "done"}
|
|
139
|
+
end
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Plain Lua Style (now fixed):**
|
|
144
|
+
```lua
|
|
145
|
+
function main(input)
|
|
146
|
+
local approved = Human.approve({message = "Continue?"})
|
|
147
|
+
return {result = "done"}
|
|
148
|
+
end
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Expected Behavior
|
|
152
|
+
|
|
153
|
+
Running `tactus examples/90-hitl-simple.tac` should now:
|
|
154
|
+
|
|
155
|
+
1. ✅ Execute top-level prints
|
|
156
|
+
2. ✅ Auto-register `function main()`
|
|
157
|
+
3. ✅ Execute `main()` function body
|
|
158
|
+
4. ✅ Show HITL prompts for `Human.approve()`, `Human.input()`, `Human.review()`
|
|
159
|
+
5. ✅ Wait for user input at CLI
|
|
160
|
+
6. ✅ Resume execution after user responds
|
|
161
|
+
7. ✅ Complete workflow successfully with result
|
|
162
|
+
|
|
163
|
+
## Testing Instructions
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# With Python 3.11+ environment
|
|
167
|
+
tactus examples/90-hitl-simple.tac
|
|
168
|
+
|
|
169
|
+
# Or run individual test scripts
|
|
170
|
+
python3 test_full_flow.py # Tests Lupa function execution
|
|
171
|
+
python3 test_transform_full.py # Tests transformation logic
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Next Steps
|
|
175
|
+
|
|
176
|
+
The fix is complete and ready for testing with Python 3.11+. All debug code has been removed, and the implementation is clean and well-documented.
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Checkpoint and Resume Implementation Plan
|
|
2
|
+
|
|
3
|
+
## Problem Statement
|
|
4
|
+
|
|
5
|
+
Currently, when a procedure hits `Human.approve()` or other HITL calls:
|
|
6
|
+
1. ✅ It raises `ProcedureWaitingForHuman`
|
|
7
|
+
2. ✅ The pending request is stored in storage backend
|
|
8
|
+
3. ❌ **ON RESUME: The runtime doesn't check for existing responses**
|
|
9
|
+
4. ❌ **The procedure reruns from scratch, not from checkpoint**
|
|
10
|
+
|
|
11
|
+
**Required behavior:**
|
|
12
|
+
- Kill a procedure waiting for human input (Ctrl+C)
|
|
13
|
+
- Restart the procedure
|
|
14
|
+
- It should resume from the exact checkpoint where it was waiting
|
|
15
|
+
- LLM calls should return the same cached results
|
|
16
|
+
- Human responses should be retrieved from storage if available
|
|
17
|
+
|
|
18
|
+
## Current State
|
|
19
|
+
|
|
20
|
+
### What Works ✅
|
|
21
|
+
- `ControlLoopHandler._store_pending()` - Stores pending HITL request
|
|
22
|
+
- `ControlLoopHandler.check_pending_response()` - Can retrieve stored responses
|
|
23
|
+
- `ProcedureWaitingForHuman` exception raised and caught
|
|
24
|
+
- Storage backend supports `get_state()` and `set_state()`
|
|
25
|
+
|
|
26
|
+
### What's Missing ❌
|
|
27
|
+
|
|
28
|
+
1. **Resume Flow Not Implemented**
|
|
29
|
+
- Runtime doesn't check `check_pending_response()` on restart
|
|
30
|
+
- No logic to skip to the checkpoint position
|
|
31
|
+
- No integration with execution log checkpoints
|
|
32
|
+
|
|
33
|
+
2. **LLM Completion Caching**
|
|
34
|
+
- No caching of LLM responses for deterministic replay
|
|
35
|
+
- Need to store completions in execution log
|
|
36
|
+
- Need to replay from cache on resume
|
|
37
|
+
|
|
38
|
+
3. **Checkpoint Position Tracking**
|
|
39
|
+
- Need to know which checkpoint we're resuming from
|
|
40
|
+
- Need to skip already-executed steps
|
|
41
|
+
- Need to restore Lua execution state
|
|
42
|
+
|
|
43
|
+
## Implementation Steps
|
|
44
|
+
|
|
45
|
+
### Phase 1: Basic Resume Flow
|
|
46
|
+
|
|
47
|
+
**Goal:** Kill and restart a procedure waiting for HITL, have it check storage for response and continue.
|
|
48
|
+
|
|
49
|
+
**Files to Modify:**
|
|
50
|
+
|
|
51
|
+
1. **`tactus/core/runtime.py`** - Add resume check at start of execution:
|
|
52
|
+
```python
|
|
53
|
+
async def execute(self, ...):
|
|
54
|
+
# ... existing setup ...
|
|
55
|
+
|
|
56
|
+
# Check for pending HITL responses BEFORE executing workflow
|
|
57
|
+
if self.control_handler and self.storage:
|
|
58
|
+
pending_responses = await self._check_pending_control_responses(procedure_id)
|
|
59
|
+
if pending_responses:
|
|
60
|
+
logger.info(f"Found {len(pending_responses)} pending control responses, resuming...")
|
|
61
|
+
# Store these for the control loop to return immediately
|
|
62
|
+
self._pending_responses = pending_responses
|
|
63
|
+
|
|
64
|
+
# ... continue with normal execution ...
|
|
65
|
+
|
|
66
|
+
async def _check_pending_control_responses(self, procedure_id: str):
|
|
67
|
+
"""Check storage for any pending control responses."""
|
|
68
|
+
state = self.storage.get_state(procedure_id) or {}
|
|
69
|
+
responses = {}
|
|
70
|
+
for key, value in state.items():
|
|
71
|
+
if key.startswith("control_pending:"):
|
|
72
|
+
if value.get("response"):
|
|
73
|
+
request_id = key.replace("control_pending:", "")
|
|
74
|
+
responses[request_id] = ControlResponse(**value["response"])
|
|
75
|
+
return responses
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
2. **`tactus/adapters/control_loop.py`** - Check for cached responses first:
|
|
79
|
+
```python
|
|
80
|
+
async def _request_interaction_async(self, request: ControlRequest) -> ControlResponse:
|
|
81
|
+
# Check if we already have a response from previous run
|
|
82
|
+
if self.storage:
|
|
83
|
+
cached_response = self.check_pending_response(
|
|
84
|
+
request.procedure_id,
|
|
85
|
+
request.request_id
|
|
86
|
+
)
|
|
87
|
+
if cached_response:
|
|
88
|
+
logger.info(f"Using cached response for {request.request_id}")
|
|
89
|
+
return cached_response
|
|
90
|
+
|
|
91
|
+
# ... existing fanout logic ...
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
3. **Store responses when received:**
|
|
95
|
+
```python
|
|
96
|
+
# In _request_interaction_async, after getting response:
|
|
97
|
+
if response and self.storage:
|
|
98
|
+
self._store_response(request, response)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Phase 2: LLM Completion Caching
|
|
102
|
+
|
|
103
|
+
**Goal:** Cache LLM completions in execution log so reruns are deterministic.
|
|
104
|
+
|
|
105
|
+
**Approach:**
|
|
106
|
+
- Execution log already exists (ProcedureMetadata.execution_log)
|
|
107
|
+
- Add LLM completions to checkpoints
|
|
108
|
+
- On resume, replay cached completions
|
|
109
|
+
|
|
110
|
+
**Files to Modify:**
|
|
111
|
+
|
|
112
|
+
1. **`tactus/core/execution_context.py`** - Cache LLM completions:
|
|
113
|
+
```python
|
|
114
|
+
async def chat_completion(self, messages, ...):
|
|
115
|
+
# Check if we have a cached completion for this position
|
|
116
|
+
if self.storage and self.resume_mode:
|
|
117
|
+
cached = self._get_cached_completion(position=self.current_checkpoint)
|
|
118
|
+
if cached:
|
|
119
|
+
logger.info(f"Using cached LLM completion at checkpoint {self.current_checkpoint}")
|
|
120
|
+
return cached
|
|
121
|
+
|
|
122
|
+
# Call LLM
|
|
123
|
+
result = await self.client.create_completion(...)
|
|
124
|
+
|
|
125
|
+
# Store in execution log for future resume
|
|
126
|
+
if self.storage:
|
|
127
|
+
self._store_completion(position=self.current_checkpoint, result=result)
|
|
128
|
+
|
|
129
|
+
return result
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Phase 3: Checkpoint-Based Resume
|
|
133
|
+
|
|
134
|
+
**Goal:** Skip already-executed steps, resume from exact checkpoint.
|
|
135
|
+
|
|
136
|
+
**Approach:**
|
|
137
|
+
- Track execution position in Lua state
|
|
138
|
+
- On resume, fast-forward to the checkpoint position
|
|
139
|
+
- This is more complex and may require Lua coroutine management
|
|
140
|
+
|
|
141
|
+
## Test Plan
|
|
142
|
+
|
|
143
|
+
### Test 1: Basic HITL Resume (No LLM)
|
|
144
|
+
|
|
145
|
+
```lua
|
|
146
|
+
-- test-resume-basic.tac
|
|
147
|
+
function main()
|
|
148
|
+
print("Step 1: Before HITL")
|
|
149
|
+
local approved = Human.approve("Should we continue?")
|
|
150
|
+
print("Step 2: After HITL, approved=" .. tostring(approved))
|
|
151
|
+
return {approved = approved}
|
|
152
|
+
end
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Test Steps:**
|
|
156
|
+
1. Run: `tactus run test-resume-basic.tac`
|
|
157
|
+
2. Wait for "Should we continue?" prompt
|
|
158
|
+
3. Kill with Ctrl+C
|
|
159
|
+
4. Respond via control CLI: `tactus control --respond y`
|
|
160
|
+
5. Restart: `tactus run test-resume-basic.tac`
|
|
161
|
+
6. **Expected:** Should NOT print "Step 1" again, should continue from HITL
|
|
162
|
+
7. **Expected:** Should print "Step 2: After HITL, approved=true"
|
|
163
|
+
|
|
164
|
+
### Test 2: LLM + HITL Resume
|
|
165
|
+
|
|
166
|
+
```lua
|
|
167
|
+
-- test-resume-llm.tac
|
|
168
|
+
function main()
|
|
169
|
+
print("Step 1: Calling LLM")
|
|
170
|
+
local result = Agent.run({
|
|
171
|
+
prompt = "Generate a random joke",
|
|
172
|
+
model = "gpt-3.5-turbo"
|
|
173
|
+
})
|
|
174
|
+
print("Step 2: LLM returned: " .. result.output)
|
|
175
|
+
|
|
176
|
+
print("Step 3: Asking for approval")
|
|
177
|
+
local approved = Human.approve("Like this joke?")
|
|
178
|
+
|
|
179
|
+
print("Step 4: Done, approved=" .. tostring(approved))
|
|
180
|
+
return {joke = result.output, approved = approved}
|
|
181
|
+
end
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Test Steps:**
|
|
185
|
+
1. Run: `tactus run test-resume-llm.tac`
|
|
186
|
+
2. Let LLM complete, note the joke
|
|
187
|
+
3. Wait for approval prompt
|
|
188
|
+
4. Kill with Ctrl+C
|
|
189
|
+
5. Respond via control CLI: `tactus control --respond y`
|
|
190
|
+
6. Restart: `tactus run test-resume-llm.tac`
|
|
191
|
+
7. **Expected:** Should NOT call LLM again (cached completion)
|
|
192
|
+
8. **Expected:** Should show SAME joke as first run
|
|
193
|
+
9. **Expected:** Should skip to "Step 4: Done"
|
|
194
|
+
|
|
195
|
+
### Test 3: Multiple HITL Points
|
|
196
|
+
|
|
197
|
+
```lua
|
|
198
|
+
-- test-resume-multi.tac
|
|
199
|
+
function main()
|
|
200
|
+
print("Step 1")
|
|
201
|
+
local first = Human.approve("First question?")
|
|
202
|
+
print("Step 2, first=" .. tostring(first))
|
|
203
|
+
|
|
204
|
+
local second = Human.approve("Second question?")
|
|
205
|
+
print("Step 3, second=" .. tostring(second))
|
|
206
|
+
|
|
207
|
+
return {first = first, second = second}
|
|
208
|
+
end
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Test Steps:**
|
|
212
|
+
1. Run, respond to first question with 'y', kill at second question
|
|
213
|
+
2. Respond to second via control CLI: `tactus control --respond n`
|
|
214
|
+
3. Restart
|
|
215
|
+
4. **Expected:** Should skip first question (already answered)
|
|
216
|
+
5. **Expected:** Should use cached response for second question
|
|
217
|
+
6. **Expected:** Should complete immediately
|
|
218
|
+
|
|
219
|
+
## Success Criteria
|
|
220
|
+
|
|
221
|
+
✅ **Phase 1 Complete When:**
|
|
222
|
+
- Can kill at HITL prompt, respond via control CLI, restart, and continue
|
|
223
|
+
- Procedure doesn't rerun from start
|
|
224
|
+
- Stored response is used
|
|
225
|
+
|
|
226
|
+
✅ **Phase 2 Complete When:**
|
|
227
|
+
- LLM calls are cached in execution log
|
|
228
|
+
- Reruns use cached completions (deterministic)
|
|
229
|
+
- Can verify completion is identical across runs
|
|
230
|
+
|
|
231
|
+
✅ **Phase 3 Complete When:**
|
|
232
|
+
- Can handle multiple HITL points with partial progress
|
|
233
|
+
- Execution jumps to correct checkpoint position
|
|
234
|
+
- All prior state is properly restored
|
|
235
|
+
|
|
236
|
+
## Timeline Priority
|
|
237
|
+
|
|
238
|
+
**CRITICAL - Do This First:**
|
|
239
|
+
- Phase 1: Basic resume flow (essential infrastructure)
|
|
240
|
+
- Test 1: Verify basic HITL resume works
|
|
241
|
+
|
|
242
|
+
**HIGH - Do Next:**
|
|
243
|
+
- Phase 2: LLM caching (needed for determinism)
|
|
244
|
+
- Test 2: Verify LLM + HITL resume
|
|
245
|
+
|
|
246
|
+
**MEDIUM - Nice to Have:**
|
|
247
|
+
- Phase 3: Multi-checkpoint resume
|
|
248
|
+
- Test 3: Verify multiple HITL points
|
|
249
|
+
|
|
250
|
+
## Notes
|
|
251
|
+
|
|
252
|
+
- Storage backend already supports `get_state()` and `set_state()`
|
|
253
|
+
- Execution log structure already exists in `ProcedureMetadata`
|
|
254
|
+
- The hard part is integrating the resume check at the right point in the runtime
|
|
255
|
+
- May need to add a "resume mode" flag to know we're resuming vs. fresh start
|