anomx 2.3.0__tar.gz → 2.3.2__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.
- {anomx-2.3.0 → anomx-2.3.2}/PKG-INFO +1 -1
- {anomx-2.3.0 → anomx-2.3.2}/pyproject.toml +1 -1
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__init__.py +1 -1
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/mode.py +2 -1
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/platform_client.py +13 -3
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime.py +24 -7
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/__init__.py +1 -0
- anomx-2.3.2/src/anomx/agent/skills/create-system-models/SKILL.md +69 -0
- anomx-2.3.2/src/anomx/agent/skills/create-system-models/references/model-format.md +57 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/store.py +26 -10
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/__init__.py +2 -0
- anomx-2.3.2/src/anomx/agent/tools/manage_tasks.py +100 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/manage_workspace_files.py +35 -10
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/config.py +24 -7
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli.py +4 -1
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_optimization.py +2 -2
- anomx-2.3.2/tests/test_agent_manage_tasks.py +95 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_menu.py +11 -4
- anomx-2.3.2/tests/test_agent_platform_timeouts.py +39 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_skill_files.py +5 -1
- anomx-2.3.2/tests/test_agent_task_models.py +56 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_files.py +45 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_package.py +2 -2
- {anomx-2.3.0 → anomx-2.3.2}/.github/workflows/ci.yml +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/.gitignore +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/.pre-commit-config.yaml +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/AGENTS.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/CHANGELOG.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/CONTRIBUTING.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/LICENSE +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/README.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/THIRD_PARTY_NOTICES.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-01.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-02.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-03.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/logo-dark.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/logo-light.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/assets/logo.png +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/api.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/architecture.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/context-management.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/datasets.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/flexible-jobs.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/index.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/local-experiments.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/models-and-detection.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/native-daq.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/processing-and-metrics.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/runs.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/docs/timeseries.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/examples/baseline_detection.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/examples/flexible_job_training.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/examples/naive_forecast.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/licenses/DARTS-APACHE-2.0.txt +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/mkdocs.yml +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/release.sh +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__main__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_logging.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_typing.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_formatting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_lazy.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_plotting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/likelihood_models/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/likelihood_models/base.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/missing_values.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/timeseries_generation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/ts_utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_shared.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/main_agent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/platform_agent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/sub_agent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/app.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/anthropic.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/blablador.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/desy_assistant.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/kimi.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/ollama.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/openai.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/openai_chat.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/agents.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/backends.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/exceptions.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/interactions.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/processes.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/subagents.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/tools.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/brain.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/command_mode.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/context_management.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/backends.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/tools.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/file_reference_search.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/anomx_api.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/approval.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/container_runtime.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/debug.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/delegation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/extract_json.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/file_activity.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/local_sandbox.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/pending_approvals.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/read_only_python.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/sandbox.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/state.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/terminal.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/terminal_colors.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/tool_manager.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/tool_results.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/workspace_storage.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/memories.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/model_catalog.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/Dockerfile +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/install-tools.sh +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/requirements.txt +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_process.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/browse-files/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/create-dataset/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/create-dataset/references/sources.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/edit-workspace/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/files.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-acquisition/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-data/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-integrations/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-jobs/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-jobs/references/jobs.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-recommendations/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-systems/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-systems/references/contracts.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/retrieve-data/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/compute-work.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/forecast.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/lstm-model.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/native-forecast.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/architectures.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/data-and-forecasting.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/findings.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/job-synthesis.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/jobs-and-work.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/scheduling.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/training.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/verification.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/use-anomx-api/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/use-anomx-api/api.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/write-work/SKILL.md +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/startup.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/anomx_platform.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/ask_question.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/chat_tabs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/chat_with_users.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/check_approval.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/check_command_status.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/cli_command.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/compress_context.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/create_plan.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/data_adapters.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/end_process.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/finish_anyways.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/finish_goal.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/focus_object.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/get_subagent_info.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/glob.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/grep.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/kill_command.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/list_directory.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/manage_workspace_storage.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/memorize.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/mount_folder.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/output_response.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/plan_schema.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/produce_output.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/prompt_subagent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/read_file.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/remove_plan.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/remove_subagent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/send_feedback.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/show_object.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/start_process.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/start_subagent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/update_plan.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/use_anomx_api.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/wait.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/web_fetch.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/web_search.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/activity.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/bottom_bar.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/info_box.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/messages.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/popup.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/prompt_bar.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/constants.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/features.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/models.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/approve_update.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/approve_workspace.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/matrix_loading.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/onboarding.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/project.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/session.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/subagent.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/wave.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/_arrays.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/capabilities.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/component.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/discovery.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/signature.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/cli.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/config.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/console.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/_selection.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/_timestamps.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/adapters.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/characteristics.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/client.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/connector.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/relations.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/transform.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/cache.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/dataset.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/download.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/loaders.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dataframe.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/_plot.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/cost_matrix.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/dtw.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/window.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/encoder_base.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/encoders.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/pipeline.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/resampling.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/base_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/boxcox.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/diff.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/fittable_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/invertible_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/mappers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/midas.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/missing_values_filler.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/reconciliation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/scaler.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/static_covariates_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/window_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/daq.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/local_fs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/mounted.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/platform.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/timeseries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/core.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/observations.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/timeseries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/detectors.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/scorers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/quantile.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/threshold.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/timeseries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/generic.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/pipeline.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/results.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/absolute_error.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/timeseries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/zscore.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/backends/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/backends/local.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/algorithm.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/tracking.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/catalog.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/context.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/jobs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/local.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/nodes.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/pipeline.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/results.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/runner.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/runs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/artifacts.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/data.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/graph.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/values.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/helpers/utils/dataset_files.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/adapters.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/detectors.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/models.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/scorers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/client.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/tracking.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/workspaces.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/metrics.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/plotting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/classifiers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/model.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/normality.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/constant.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/darts_naive_seasonal.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/native.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/rolling_window.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/generic.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/onnx.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/pca.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/torch_autoencoder.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/__init__.pyi +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/isolation_forest.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/results.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/torch.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/src/anomx/py.typed +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/conftest.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_classification_metrics.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_metrics.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_plotting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/parametrize_helpers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/dtw/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/dtw/test_dtw.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/test_covariate_index_generators.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/test_encoders.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/test_pipeline.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_base_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_boxcox.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_diff.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_fittable_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_invertible_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_invertible_fittable_data_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_mappers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_midas.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_missing_values_filler.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_reconciliation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_static_covariates_transformer.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_window_transformations.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_activity_presentation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_activity_wave.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_anomx_api.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_approval_policy.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_background_approvals.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_brain.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_chat_tabs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_chat_with_users.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli_experience.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli_sandbox_lifecycle.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_command_mode.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_config_navigation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_container_runtime.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_budget.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_failures.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_lifecycle.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_policy.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_data_adapters.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_discovery_context.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_file_activity.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_focus_and_live_mode.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_forecast_template.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_goal_and_delegation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_interruption_recovery.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_kimi.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_migration_recovery.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_migration_startup.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_catalog.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_retries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_native_forecast_template.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_optional_questions.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_pending_approvals.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_persistent_sandbox.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_platform_discovery.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_produce_output.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_project_design.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_question_ui.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_reasoning.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_result_files.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_roles_and_platform_tools.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_runtime_process.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_stream_phases.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_terminal_colors.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_updates.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_usage.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_work_visualization.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_layout.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_storage.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_architecture.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_base.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_components.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_daq_reader.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_darts_foundations.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_cache.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_download_cache.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_file_selection.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_selection.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_sources.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_job_workspace.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_local_execution.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_local_execution_review.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_model_inference.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_mounted_datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_native_detection.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_native_forecasting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_platform_client.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_platform_datasets.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_processing.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_public_stubs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_pytorch_model.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_runs.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_artifacts.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_context.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_dataset.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_graph.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/__init__.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/conftest.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/parametrize_helpers.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_config.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_missing_values.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_native_boundary.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_generation.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_multivariate.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_plot.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_plotly.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_repr_formatting.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_static_covariates.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_ts_utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_utils.py +0 -0
- {anomx-2.3.0 → anomx-2.3.2}/tools/generate_public_stubs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: anomx
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.2
|
|
4
4
|
Summary: Installable time-series anomaly library with forecasting, reconstruction, and representation base approaches.
|
|
5
5
|
Project-URL: Homepage, https://www.anomx.io
|
|
6
6
|
Project-URL: Repository, https://github.com/theorieken/anomx
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "anomx"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.2"
|
|
8
8
|
description = "Installable time-series anomaly library with forecasting, reconstruction, and representation base approaches."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -112,7 +112,8 @@ _MODE_POLICIES = {
|
|
|
112
112
|
"avoid duplicate findings. Read operations are allowed. The only permitted "
|
|
113
113
|
"platform write by default is creating a recommendation through "
|
|
114
114
|
"POST /recommendations. For local housekeeping, manage_workspace_files may "
|
|
115
|
-
"write compact brain checkpoints and tmp files
|
|
115
|
+
"write compact brain checkpoints and tmp files (also task notes for agent users), "
|
|
116
|
+
"and delete exact tmp files "
|
|
116
117
|
"with revision checks. This exception does not authorize arbitrary shell writes. "
|
|
117
118
|
"A platform-provided policy and scoped API credential may permit direct create, "
|
|
118
119
|
"update or delete operations on specifically listed object models. Recommend all "
|
|
@@ -16,6 +16,9 @@ from anomx.agent.skills import sync_platform_skills
|
|
|
16
16
|
from anomx.agent.store import AnomxHome
|
|
17
17
|
|
|
18
18
|
DEFAULT_TIMEOUT_SECONDS = 10
|
|
19
|
+
# Directory authentication can spend 45 seconds in PAM, followed by storage provisioning.
|
|
20
|
+
LOGIN_TIMEOUT_SECONDS = 90
|
|
21
|
+
HEARTBEAT_TIMEOUT_SECONDS = 30
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
@dataclass(frozen=True)
|
|
@@ -290,9 +293,14 @@ def _request_json(
|
|
|
290
293
|
*,
|
|
291
294
|
method: str = "POST",
|
|
292
295
|
token: str | None = None,
|
|
296
|
+
timeout: float | None = None,
|
|
293
297
|
) -> dict[str, Any]:
|
|
294
298
|
normalized_path = path if path.startswith("/") else f"/{path}"
|
|
295
299
|
url = f"{base_url}{normalized_path}"
|
|
300
|
+
if timeout is None:
|
|
301
|
+
timeout = LOGIN_TIMEOUT_SECONDS if normalized_path == "/auth/login" else HEARTBEAT_TIMEOUT_SECONDS if normalized_path == "/auth/me/agent/heartbeat" else DEFAULT_TIMEOUT_SECONDS
|
|
302
|
+
phase = "signing in" if normalized_path == "/auth/login" else "registering the CLI agent" if normalized_path == "/auth/me/agent/heartbeat" else "contacting the platform"
|
|
303
|
+
timeout_message = f"Timed out after {timeout:g} seconds while {phase} at {platform_domain(base_url)} ({method} {normalized_path})."
|
|
296
304
|
body = None if method == "GET" else json.dumps(payload).encode("utf-8")
|
|
297
305
|
headers = {
|
|
298
306
|
"Accept": "application/json",
|
|
@@ -304,14 +312,16 @@ def _request_json(
|
|
|
304
312
|
headers["Authorization"] = f"Bearer {token}"
|
|
305
313
|
request = Request(url, data=body, headers=headers, method=method)
|
|
306
314
|
try:
|
|
307
|
-
with urlopen(request, timeout=
|
|
315
|
+
with urlopen(request, timeout=timeout) as response:
|
|
308
316
|
response_body = response.read().decode("utf-8", errors="replace")
|
|
309
317
|
except HTTPError as exc:
|
|
310
318
|
raise PlatformHttpError(exc.code, _format_http_error(exc)) from exc
|
|
311
319
|
except URLError as exc:
|
|
312
|
-
|
|
320
|
+
if isinstance(exc.reason, TimeoutError):
|
|
321
|
+
raise PlatformClientError(timeout_message) from exc
|
|
322
|
+
raise PlatformClientError(f"Could not reach the platform at {platform_domain(base_url)}: {exc.reason}") from exc
|
|
313
323
|
except TimeoutError as exc:
|
|
314
|
-
raise PlatformClientError(
|
|
324
|
+
raise PlatformClientError(timeout_message) from exc
|
|
315
325
|
|
|
316
326
|
if not response_body.strip():
|
|
317
327
|
return {}
|
|
@@ -252,6 +252,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
252
252
|
api_key_resolver: Callable[[str], str | None] | None = None,
|
|
253
253
|
background_backend_resolver: Callable[[str, AgentRuntime], tuple[BaseBackend, str] | None]
|
|
254
254
|
| None = None,
|
|
255
|
+
live_instructions: Callable[[], str] | None = None,
|
|
255
256
|
) -> None:
|
|
256
257
|
self.home = home
|
|
257
258
|
self.home.ensure()
|
|
@@ -328,6 +329,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
328
329
|
self.platform_chat_id = platform_chat_id
|
|
329
330
|
self.agent_user = agent_user
|
|
330
331
|
self.additional_instructions = additional_instructions.strip()
|
|
332
|
+
self.live_instructions = live_instructions
|
|
331
333
|
self.task_instructions = task_instructions.strip()
|
|
332
334
|
self.context_optimizer = context_optimizer
|
|
333
335
|
self.context_optimizer_context_window = context_optimizer_context_window
|
|
@@ -1398,7 +1400,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
1398
1400
|
item = entries[0].payload
|
|
1399
1401
|
backend_model = None
|
|
1400
1402
|
if self.context_optimizer is None:
|
|
1401
|
-
backend_model = self._background_work_backend("
|
|
1403
|
+
backend_model = self._background_work_backend("task_context_compression_model")
|
|
1402
1404
|
if backend_model is None:
|
|
1403
1405
|
return None
|
|
1404
1406
|
window = (
|
|
@@ -1754,7 +1756,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
1754
1756
|
summary_backend: BaseBackend | None = None
|
|
1755
1757
|
summary_model = ""
|
|
1756
1758
|
if self.context_summarizer is None:
|
|
1757
|
-
background_model = self._background_work_backend("
|
|
1759
|
+
background_model = self._background_work_backend("task_context_compression_model")
|
|
1758
1760
|
if background_model is None:
|
|
1759
1761
|
raise AgentBackendError(
|
|
1760
1762
|
"Context compression is required, but no summary model is available.",
|
|
@@ -1957,7 +1959,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
1957
1959
|
if not messages:
|
|
1958
1960
|
return None
|
|
1959
1961
|
|
|
1960
|
-
background_model = self._background_work_backend("
|
|
1962
|
+
background_model = self._background_work_backend("task_session_naming_model")
|
|
1961
1963
|
if background_model is not None:
|
|
1962
1964
|
backend, model = background_model
|
|
1963
1965
|
try:
|
|
@@ -1975,7 +1977,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
1975
1977
|
prompt = (
|
|
1976
1978
|
f"Directory path:\n{project_path}\n\nDirectory structure, first 3 levels:\n{outline}"
|
|
1977
1979
|
)
|
|
1978
|
-
background_model = self._background_work_backend("
|
|
1980
|
+
background_model = self._background_work_backend("task_system_tasks_model")
|
|
1979
1981
|
if background_model is not None:
|
|
1980
1982
|
backend, model = background_model
|
|
1981
1983
|
try:
|
|
@@ -1994,7 +1996,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
1994
1996
|
if not messages:
|
|
1995
1997
|
return fallback
|
|
1996
1998
|
|
|
1997
|
-
background_model = self._background_work_backend("
|
|
1999
|
+
background_model = self._background_work_backend("task_system_tasks_model")
|
|
1998
2000
|
if background_model is not None:
|
|
1999
2001
|
backend, model = background_model
|
|
2000
2002
|
try:
|
|
@@ -2012,7 +2014,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
2012
2014
|
) -> CommandRiskEvaluation | None:
|
|
2013
2015
|
"""Evaluate a pending command approval request with the selected backend."""
|
|
2014
2016
|
|
|
2015
|
-
background_model = self._background_work_backend("
|
|
2017
|
+
background_model = self._background_work_backend("task_system_tasks_model")
|
|
2016
2018
|
candidates = [background_model] if background_model is not None else []
|
|
2017
2019
|
if self.backend is not None:
|
|
2018
2020
|
primary = (self.backend, str(self.home.load_config().get("model") or ""))
|
|
@@ -2041,7 +2043,7 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
2041
2043
|
) -> MemoryMetadata:
|
|
2042
2044
|
"""Suggest memory metadata with a deterministic fallback."""
|
|
2043
2045
|
|
|
2044
|
-
background_model = self._background_work_backend("
|
|
2046
|
+
background_model = self._background_work_backend("task_system_tasks_model")
|
|
2045
2047
|
if background_model is not None:
|
|
2046
2048
|
backend, model = background_model
|
|
2047
2049
|
try:
|
|
@@ -2064,9 +2066,17 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
2064
2066
|
self,
|
|
2065
2067
|
config_key: str,
|
|
2066
2068
|
) -> tuple[BaseBackend, str] | None:
|
|
2069
|
+
from anomx.agent.store import TASK_MODEL_FALLBACKS, TASK_MODEL_SELECTION
|
|
2070
|
+
|
|
2067
2071
|
if self.background_backend_resolver is not None:
|
|
2068
2072
|
return self.background_backend_resolver(config_key, self)
|
|
2069
2073
|
config = self.home.load_config()
|
|
2074
|
+
if config_key in TASK_MODEL_FALLBACKS and config.get(config_key, TASK_MODEL_SELECTION) == TASK_MODEL_SELECTION:
|
|
2075
|
+
system_key = "task_system_tasks_model"
|
|
2076
|
+
if config_key != system_key and config.get(system_key, TASK_MODEL_SELECTION) != TASK_MODEL_SELECTION:
|
|
2077
|
+
config_key = system_key
|
|
2078
|
+
else:
|
|
2079
|
+
config_key = TASK_MODEL_FALLBACKS[config_key]
|
|
2070
2080
|
selection = str(config.get(config_key) or CURRENT_MODEL_SELECTION).strip()
|
|
2071
2081
|
if selection == CURRENT_MODEL_SELECTION:
|
|
2072
2082
|
provider = str(config.get("provider") or "").strip()
|
|
@@ -2541,8 +2551,13 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
2541
2551
|
]
|
|
2542
2552
|
if self.agent_user and self.agent_kind == AgentKind.MAIN and self.has_platform_connection():
|
|
2543
2553
|
from anomx.agent.tools.chat_with_users import ChatWithUsersTool
|
|
2554
|
+
from anomx.agent.tools.manage_tasks import ManageTasksTool
|
|
2555
|
+
from anomx.agent.tools.manage_workspace_files import ManageWorkspaceFilesTool
|
|
2544
2556
|
|
|
2557
|
+
tools = [tool for tool in tools if tool.name != "manage_workspace_files"]
|
|
2558
|
+
tools.append(ManageWorkspaceFilesTool(agent_tasks=True))
|
|
2545
2559
|
tools.append(ChatWithUsersTool())
|
|
2560
|
+
tools.append(ManageTasksTool())
|
|
2546
2561
|
if self._running_command_states():
|
|
2547
2562
|
tools.extend(command_control_tools())
|
|
2548
2563
|
if self._context_compression_available():
|
|
@@ -3588,6 +3603,8 @@ class AgentRuntime(WorkspaceStorageMixin, PendingApprovalsMixin):
|
|
|
3588
3603
|
)
|
|
3589
3604
|
if self.additional_instructions:
|
|
3590
3605
|
sections.append(self.additional_instructions)
|
|
3606
|
+
if self.live_instructions is not None:
|
|
3607
|
+
sections.append(self.live_instructions())
|
|
3591
3608
|
user_name = str(self.home.load_config().get("user_name") or "").strip()
|
|
3592
3609
|
if user_name:
|
|
3593
3610
|
sections.append(f"User profile:\n- Name: {user_name}")
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-system-models
|
|
3
|
+
description: Create, edit, or reuse a system's compound 3D representation for Anomx graphs and the system model editor. Use for visual models, not system hierarchy, icons, simulation meshes, or manufacturing CAD exports.
|
|
4
|
+
metadata:
|
|
5
|
+
title: Create System Models
|
|
6
|
+
requires_platform: true
|
|
7
|
+
keywords: system, 3d, model, geometry, visualization, mini cad, design
|
|
8
|
+
anomx_models: systems_system
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Create system models
|
|
12
|
+
|
|
13
|
+
Design a recognizable, compact system representation using the same primitives
|
|
14
|
+
as the platform's **System → Edit → Editor** tab. Read `use-anomx-api` for the
|
|
15
|
+
connected API conventions and [the model format](references/model-format.md)
|
|
16
|
+
before preparing a design. The editor and the 3D graphs consume the same
|
|
17
|
+
`properties.navigator_appearance` value.
|
|
18
|
+
|
|
19
|
+
## Resolve and inspect
|
|
20
|
+
|
|
21
|
+
Find the requested system through `GET /systems?query=<name>&limit=20`, then read
|
|
22
|
+
`GET /systems/<id>` before writing. Establish which physical or functional form
|
|
23
|
+
the user wants. Use supplied references and the system description; do not
|
|
24
|
+
invent dimensions, machinery details, or a health state from a name alone.
|
|
25
|
+
For an unspecified appearance, make a simple schematic silhouette and describe
|
|
26
|
+
it as such. Preserve an existing custom design unless the request covers editing
|
|
27
|
+
or replacing it.
|
|
28
|
+
|
|
29
|
+
To reuse a design, browse
|
|
30
|
+
`GET /systems?has_custom_visualization=true&query=<name>&limit=20&ordering=name`
|
|
31
|
+
and follow the returned pagination. Read the chosen source's properties. Copy
|
|
32
|
+
only its appearance into the target; names, metadata, hierarchy, and object
|
|
33
|
+
permissions belong to their original systems. If the server does not support
|
|
34
|
+
this filter or the requested primitive, inspect its schema and report the
|
|
35
|
+
capability mismatch instead of silently claiming the model was saved.
|
|
36
|
+
|
|
37
|
+
## Design
|
|
38
|
+
|
|
39
|
+
Start with the fewest primitives that make the silhouette recognizable at node
|
|
40
|
+
size. Use named components for meaningful pieces so the user can select and
|
|
41
|
+
edit them later. Position, rotate and scale components to assemble the model;
|
|
42
|
+
use colors and material values deliberately. A cylinder with supports often
|
|
43
|
+
communicates a vessel better than many tiny decorative components.
|
|
44
|
+
|
|
45
|
+
The graph centers and normalizes the complete assembly; coordinates and the
|
|
46
|
+
editor's dimensions are **model units**, not physical measurements. Check the
|
|
47
|
+
front, side, and top arrangement when preparing compound shapes. Planes and
|
|
48
|
+
circles are flat, two-sided surfaces; use boxes or cylinders for thickness.
|
|
49
|
+
Keep all values finite and within the format's bounds. The representation is
|
|
50
|
+
declarative data, not executable code or an external mesh URL.
|
|
51
|
+
|
|
52
|
+
## Save and verify
|
|
53
|
+
|
|
54
|
+
Refresh the target before writing. Merge the prepared appearance into its
|
|
55
|
+
current `properties`, preserving every unrelated key, especially `icon` and
|
|
56
|
+
existing metadata. `PATCH /systems/<id>` replaces the whole properties object;
|
|
57
|
+
send a `properties` field containing that merged object. Use the
|
|
58
|
+
normal platform API and the user's authorized scope. Appearance changes do not
|
|
59
|
+
authorize creating systems, changing roles or connections, editing metadata,
|
|
60
|
+
or overwriting a different system's design. Respect write denials.
|
|
61
|
+
|
|
62
|
+
Read the saved target back and compare the returned appearance to the intended
|
|
63
|
+
design. If a visual preview is available, inspect the silhouette and component
|
|
64
|
+
overlap in the editor or graph. Distinguish readback verification from actual
|
|
65
|
+
visual verification. Report the affected system and what changed.
|
|
66
|
+
|
|
67
|
+
To restore automatic branch coloring and the default sphere, remove only
|
|
68
|
+
`navigator_appearance` from the merged properties. Do not replace the entire
|
|
69
|
+
properties object with an empty object.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Model format
|
|
2
|
+
|
|
3
|
+
The API stores a model at `System.properties.navigator_appearance`:
|
|
4
|
+
|
|
5
|
+
| Field | Values | Default |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `shape` | `sphere`, `box`, `cylinder`, `cone`, `torus`, `capsule`, `octahedron`, `plane`, `circle` | `sphere` |
|
|
8
|
+
| `color` | Six-digit hexadecimal RGB, e.g. `#80b8d1` | `#8b91ad` |
|
|
9
|
+
| `scale` | Number from 0.5 to 2; overall graph size | 1 |
|
|
10
|
+
| `metalness` | Number from 0 to 1 | 0.15 |
|
|
11
|
+
| `roughness` | Number from 0 to 1 | 0.4 |
|
|
12
|
+
| `parts` | Up to 24 component objects | Single `shape` |
|
|
13
|
+
|
|
14
|
+
A nonempty `parts` array replaces the single primitive. Each component accepts:
|
|
15
|
+
|
|
16
|
+
| Field | Values |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `name` | Optional component label, at most 80 characters |
|
|
19
|
+
| `shape` | A primitive from the table above |
|
|
20
|
+
| `color` | Optional six-digit RGB; inherits the model color |
|
|
21
|
+
| `metalness`, `roughness` | Optional numbers from 0 to 1; inherit model material |
|
|
22
|
+
| `position` | Three model coordinates, each from −4 to 4; default `[0,0,0]` |
|
|
23
|
+
| `rotation` | Three Euler XYZ angles in **radians**, each from −6.284 to 6.284; default zero |
|
|
24
|
+
| `scale` | Three scale factors, each from 0.1 to 4; default `[1,1,1]` |
|
|
25
|
+
|
|
26
|
+
The UI shows angles in degrees, but the API stores radians. Y is up. Planes and
|
|
27
|
+
circles lie in XY, facing along ±Z; rotate by π/2 around X for a horizontal
|
|
28
|
+
surface. Cylinders, cones and capsules extend along Y before rotation.
|
|
29
|
+
A box is one model unit along each axis; a cylinder has diameter and height of
|
|
30
|
+
one unit. The default sphere diameter is 7/6 units. Component scale factors
|
|
31
|
+
multiply those primitive dimensions; these are not engineering measurements.
|
|
32
|
+
|
|
33
|
+
The complete assembly is centered and normalized to the graph's node footprint.
|
|
34
|
+
Overall `scale`, hierarchy size weighting and camera perspective then affect
|
|
35
|
+
its displayed size. Changes to this model do not change graph coordinates or
|
|
36
|
+
system relationships. An empty parts array falls back to the single shape in
|
|
37
|
+
the graph; removing the appearance restores the automatic default.
|
|
38
|
+
|
|
39
|
+
Example: a schematic vessel, with two supports that remain individually editable:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"color": "#80b8d1",
|
|
44
|
+
"scale": 1.25,
|
|
45
|
+
"metalness": 0.3,
|
|
46
|
+
"roughness": 0.45,
|
|
47
|
+
"parts": [
|
|
48
|
+
{"name": "Vessel", "shape": "capsule", "rotation": [0, 0, 1.5708], "scale": [1, 2, 1]},
|
|
49
|
+
{"name": "Left support", "shape": "box", "color": "#71818e", "position": [-0.7, -0.8, 0], "scale": [0.25, 0.6, 0.7]},
|
|
50
|
+
{"name": "Right support", "shape": "box", "color": "#71818e", "position": [0.7, -0.8, 0], "scale": [0.25, 0.6, 0.7]}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Reuse this pattern only when it suits the requested system. Supply actual
|
|
56
|
+
numeric arrays and supported fields; the schema does not load scripts, SVG,
|
|
57
|
+
HTML, arbitrary geometry, URLs, or external CAD files.
|
|
@@ -70,7 +70,7 @@ class ModelMenuOption:
|
|
|
70
70
|
|
|
71
71
|
@dataclass(frozen=True)
|
|
72
72
|
class BackgroundWorkModelSetting:
|
|
73
|
-
"""Configurable
|
|
73
|
+
"""Configurable model selection for a task or difficulty."""
|
|
74
74
|
|
|
75
75
|
config_key: str
|
|
76
76
|
label: str
|
|
@@ -227,7 +227,7 @@ BACKGROUND_WORK_MODEL_SETTINGS: tuple[BackgroundWorkModelSetting, ...] = (
|
|
|
227
227
|
BackgroundWorkModelSetting(
|
|
228
228
|
"background_easy_work_model",
|
|
229
229
|
"Easy tasks",
|
|
230
|
-
"Simple questions and
|
|
230
|
+
"Simple questions and lightweight tasks",
|
|
231
231
|
CURRENT_MODEL_SELECTION,
|
|
232
232
|
),
|
|
233
233
|
BackgroundWorkModelSetting(
|
|
@@ -250,6 +250,22 @@ BACKGROUND_WORK_MODEL_SETTINGS: tuple[BackgroundWorkModelSetting, ...] = (
|
|
|
250
250
|
),
|
|
251
251
|
)
|
|
252
252
|
|
|
253
|
+
|
|
254
|
+
TASK_MODEL_SELECTION = "standard"
|
|
255
|
+
SPECIFIC_TASK_MODEL_SETTINGS: tuple[BackgroundWorkModelSetting, ...] = (
|
|
256
|
+
BackgroundWorkModelSetting("task_session_naming_model", "Automatic Session Naming", "Name sessions from their conversation", TASK_MODEL_SELECTION),
|
|
257
|
+
BackgroundWorkModelSetting("task_channel_analysis_model", "Automatic Channel Analysis", "Analyze channel metadata", TASK_MODEL_SELECTION),
|
|
258
|
+
BackgroundWorkModelSetting("task_context_compression_model", "Context Compression", "Summarize history and optimize tool results", TASK_MODEL_SELECTION),
|
|
259
|
+
BackgroundWorkModelSetting("task_system_tasks_model", "Standard System Tasks", "Default for other system tasks and unset task models", TASK_MODEL_SELECTION),
|
|
260
|
+
)
|
|
261
|
+
TASK_MODEL_FALLBACKS = {
|
|
262
|
+
"task_session_naming_model": "background_easy_work_model",
|
|
263
|
+
"task_channel_analysis_model": "background_medium_work_model",
|
|
264
|
+
"task_context_compression_model": "background_easy_work_model",
|
|
265
|
+
"task_system_tasks_model": "background_easy_work_model",
|
|
266
|
+
}
|
|
267
|
+
MODEL_SETTINGS = (*BACKGROUND_WORK_MODEL_SETTINGS, *SPECIFIC_TASK_MODEL_SETTINGS)
|
|
268
|
+
|
|
253
269
|
CONTEXT_LENGTH_OPTIONS: tuple[ContextManagementOption, ...] = (
|
|
254
270
|
ContextManagementOption(
|
|
255
271
|
32_000,
|
|
@@ -570,8 +586,8 @@ DEFAULT_CONFIG: dict[str, Any] = {
|
|
|
570
586
|
"onboarding_complete": False,
|
|
571
587
|
"provider": "openai",
|
|
572
588
|
"model": "gpt-6.1-sol",
|
|
573
|
-
**{setting.config_key: setting.default for setting in
|
|
574
|
-
**{setting.effort_key: "" for setting in
|
|
589
|
+
**{setting.config_key: setting.default for setting in MODEL_SETTINGS},
|
|
590
|
+
**{setting.effort_key: "" for setting in MODEL_SETTINGS},
|
|
575
591
|
"maximum_context_tokens": DEFAULT_MAXIMUM_CONTEXT_TOKENS,
|
|
576
592
|
"user_name": "",
|
|
577
593
|
"thinking_intensity": THINKING_INTENSITY_AUTO,
|
|
@@ -608,8 +624,8 @@ CONFIG_SCALAR_FIELDS = (
|
|
|
608
624
|
"onboarding_complete",
|
|
609
625
|
"provider",
|
|
610
626
|
"model",
|
|
611
|
-
*(setting.config_key for setting in
|
|
612
|
-
*(setting.effort_key for setting in
|
|
627
|
+
*(setting.config_key for setting in MODEL_SETTINGS),
|
|
628
|
+
*(setting.effort_key for setting in MODEL_SETTINGS),
|
|
613
629
|
"maximum_context_tokens",
|
|
614
630
|
"user_name",
|
|
615
631
|
"thinking_intensity",
|
|
@@ -1331,9 +1347,9 @@ class AnomxHome:
|
|
|
1331
1347
|
config["thinking_intensity"] = normalize_thinking_intensity(
|
|
1332
1348
|
config.get("thinking_intensity")
|
|
1333
1349
|
)
|
|
1334
|
-
for setting in
|
|
1350
|
+
for setting in MODEL_SETTINGS:
|
|
1335
1351
|
if not str(config.get(setting.config_key) or "").strip():
|
|
1336
|
-
config[setting.config_key] =
|
|
1352
|
+
config[setting.config_key] = setting.default
|
|
1337
1353
|
if config.get("maximum_context_tokens") not in {
|
|
1338
1354
|
option.value for option in CONTEXT_LENGTH_OPTIONS
|
|
1339
1355
|
}:
|
|
@@ -1368,9 +1384,9 @@ class AnomxHome:
|
|
|
1368
1384
|
merged["thinking_intensity"] = normalize_thinking_intensity(
|
|
1369
1385
|
merged.get("thinking_intensity")
|
|
1370
1386
|
)
|
|
1371
|
-
for setting in
|
|
1387
|
+
for setting in MODEL_SETTINGS:
|
|
1372
1388
|
if not str(merged.get(setting.config_key) or "").strip():
|
|
1373
|
-
merged[setting.config_key] =
|
|
1389
|
+
merged[setting.config_key] = setting.default
|
|
1374
1390
|
if merged.get("maximum_context_tokens") not in {
|
|
1375
1391
|
option.value for option in CONTEXT_LENGTH_OPTIONS
|
|
1376
1392
|
}:
|
|
@@ -27,6 +27,7 @@ from anomx.agent.tools.glob import GlobTool
|
|
|
27
27
|
from anomx.agent.tools.grep import GrepTool
|
|
28
28
|
from anomx.agent.tools.kill_command import KillCommandTool
|
|
29
29
|
from anomx.agent.tools.list_directory import ListDirectoryTool
|
|
30
|
+
from anomx.agent.tools.manage_tasks import ManageTasksTool
|
|
30
31
|
from anomx.agent.tools.manage_workspace_files import ManageWorkspaceFilesTool
|
|
31
32
|
from anomx.agent.tools.manage_workspace_storage import ManageWorkspaceStorageTool
|
|
32
33
|
from anomx.agent.tools.memorize import MemorizeTool
|
|
@@ -173,6 +174,7 @@ __all__ = [
|
|
|
173
174
|
"BaseTool",
|
|
174
175
|
"ChatTabTool",
|
|
175
176
|
"ManageDataAdaptersTool",
|
|
177
|
+
"ManageTasksTool",
|
|
176
178
|
"ManageWorkspaceFilesTool",
|
|
177
179
|
"ManageWorkspaceStorageTool",
|
|
178
180
|
"CheckCommandStatusTool",
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Persistent self-managed tasks for autonomous platform users."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from anomx.agent.base.tools import BaseTool, ToolExecutionContext, object_schema
|
|
9
|
+
from anomx.agent.tools.use_anomx_api import UseAnomxApiTool
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ManageTasksTool(BaseTool):
|
|
13
|
+
def __init__(self) -> None:
|
|
14
|
+
super().__init__(
|
|
15
|
+
name="manage_tasks",
|
|
16
|
+
description=(
|
|
17
|
+
"Manage your own persistent tasks: list, add, edit or delete. Agent users only. "
|
|
18
|
+
"Add requires a stable key and title; retries with the same key reuse the "
|
|
19
|
+
"task. Edit updates title, description, completed or reminders. Omitted fields "
|
|
20
|
+
"remain unchanged. reminders replaces the list; [] removes all reminders. "
|
|
21
|
+
"Keep descriptions short and detailed content in the returned tasks/<id>/ folder. "
|
|
22
|
+
"Tasks are refreshed in your system prompt before every model request. Completed "
|
|
23
|
+
"tasks suspend reminders; recurring tasks normally remain open. Delete cancels all "
|
|
24
|
+
"reminders but retains files. Reminders can wake you outside working hours; "
|
|
25
|
+
"pauses still apply. Use ISO dates and IANA zones. Translate natural-language "
|
|
26
|
+
"reminders into once/daily/weekly. Check success before claiming a task was saved."
|
|
27
|
+
),
|
|
28
|
+
parameters=object_schema(
|
|
29
|
+
{
|
|
30
|
+
"action": {"type": "string", "enum": ["list", "add", "edit", "delete"]},
|
|
31
|
+
"task_id": {"type": "string", "description": "Task UUID for edit/delete."},
|
|
32
|
+
"key": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"maxLength": 128,
|
|
35
|
+
"description": "Stable idempotency key for add.",
|
|
36
|
+
},
|
|
37
|
+
"title": {"type": "string", "maxLength": 200},
|
|
38
|
+
"description": {"type": "string", "maxLength": 1000},
|
|
39
|
+
"completed": {"type": "boolean"},
|
|
40
|
+
"reminders": {
|
|
41
|
+
"type": "array",
|
|
42
|
+
"maxItems": 20,
|
|
43
|
+
"items": object_schema(
|
|
44
|
+
{
|
|
45
|
+
"kind": {"type": "string", "enum": ["once", "daily", "weekly"]},
|
|
46
|
+
"timezone": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"description": "IANA timezone; defaults to your timezone.",
|
|
49
|
+
},
|
|
50
|
+
"at": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": (
|
|
53
|
+
"Once: ISO date/time, e.g. 2027-03-12T12:00. "
|
|
54
|
+
"An explicit offset is also accepted."
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
"time": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Daily/weekly: local HH:MM, e.g. 08:00.",
|
|
60
|
+
},
|
|
61
|
+
"weekdays": {
|
|
62
|
+
"type": "array",
|
|
63
|
+
"items": {"type": "integer", "minimum": 0, "maximum": 6},
|
|
64
|
+
"description": "Weekly only: 0=Monday through 6=Sunday.",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
["kind"],
|
|
68
|
+
),
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
["action"],
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
def execute(self, arguments: dict[str, Any], context: ToolExecutionContext) -> str:
|
|
76
|
+
if not getattr(context.runtime, "agent_user", False):
|
|
77
|
+
return context.json_result(
|
|
78
|
+
{"ok": False, "error": "This tool requires an autonomous agent user."}
|
|
79
|
+
)
|
|
80
|
+
action = arguments.get("action")
|
|
81
|
+
if not isinstance(action, str) or action not in {"list", "add", "edit", "delete"}:
|
|
82
|
+
return context.json_result({"ok": False, "error": "Unknown task action."})
|
|
83
|
+
body = {
|
|
84
|
+
key: value
|
|
85
|
+
for key, value in arguments.items()
|
|
86
|
+
if key in {"action", "task_id", "key", "title", "description", "completed", "reminders"}
|
|
87
|
+
}
|
|
88
|
+
if action in {"edit", "delete"}:
|
|
89
|
+
try:
|
|
90
|
+
body["task_id"] = str(UUID(str(body.get("task_id", ""))))
|
|
91
|
+
except ValueError:
|
|
92
|
+
return context.json_result({"ok": False, "error": "A valid task_id is required."})
|
|
93
|
+
request: dict[str, Any] = {
|
|
94
|
+
"method": "GET" if action == "list" else "POST",
|
|
95
|
+
"path": "/users/agent-tasks",
|
|
96
|
+
"statement": f"Managing my tasks: {action}",
|
|
97
|
+
}
|
|
98
|
+
if action != "list":
|
|
99
|
+
request["body"] = body
|
|
100
|
+
return UseAnomxApiTool(statement_description="Managing my tasks").execute(request, context)
|
|
@@ -7,12 +7,13 @@ import os
|
|
|
7
7
|
import tempfile
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any
|
|
10
|
+
from uuid import UUID
|
|
10
11
|
|
|
11
12
|
from anomx.agent.base.tools import BaseTool, ToolExecutionContext
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class ManageWorkspaceFilesTool(BaseTool):
|
|
15
|
-
def __init__(self) -> None:
|
|
16
|
+
def __init__(self, *, agent_tasks: bool = False) -> None:
|
|
16
17
|
super().__init__(
|
|
17
18
|
name="manage_workspace_files",
|
|
18
19
|
description=(
|
|
@@ -21,11 +22,20 @@ class ManageWorkspaceFilesTool(BaseTool):
|
|
|
21
22
|
"approval. Use relative paths. Existing files require their current SHA-256 "
|
|
22
23
|
"as expected_sha256, so another chat's changes are preserved. On conflict, "
|
|
23
24
|
"read and reconcile the current file before retrying. No recursive deletion."
|
|
25
|
+
+ (
|
|
26
|
+
" Agent users may also write task notes with area=tasks and "
|
|
27
|
+
"path=<task-id>/README.md (or another file inside an existing task folder)."
|
|
28
|
+
if agent_tasks
|
|
29
|
+
else ""
|
|
30
|
+
)
|
|
24
31
|
),
|
|
25
32
|
parameters={
|
|
26
33
|
"type": "object",
|
|
27
34
|
"properties": {
|
|
28
|
-
"area": {
|
|
35
|
+
"area": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": ["brain", "tmp", *(["tasks"] if agent_tasks else [])],
|
|
38
|
+
},
|
|
29
39
|
"action": {"type": "string", "enum": ["write", "delete"]},
|
|
30
40
|
"path": {"type": "string"},
|
|
31
41
|
"content": {
|
|
@@ -45,12 +55,13 @@ class ManageWorkspaceFilesTool(BaseTool):
|
|
|
45
55
|
area, action = arguments.get("area"), arguments.get("action")
|
|
46
56
|
raw = str(arguments.get("path") or "")
|
|
47
57
|
if "\x00" in raw or len(raw) > 512:
|
|
48
|
-
return context.json_result(
|
|
49
|
-
"error": "Provide a valid relative path under 512 characters."
|
|
50
|
-
|
|
58
|
+
return context.json_result(
|
|
59
|
+
{"error": "Provide a valid relative path under 512 characters."}
|
|
60
|
+
)
|
|
51
61
|
relative = Path(raw)
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
areas = {"brain", "tmp", "tasks"} if context.runtime.agent_user else {"brain", "tmp"}
|
|
63
|
+
if area not in areas or action not in {"write", "delete"}:
|
|
64
|
+
return context.json_result({"error": "Choose an available area and write/delete."})
|
|
54
65
|
if (
|
|
55
66
|
not raw
|
|
56
67
|
or relative.is_absolute()
|
|
@@ -63,9 +74,23 @@ class ManageWorkspaceFilesTool(BaseTool):
|
|
|
63
74
|
return context.json_result(
|
|
64
75
|
{"error": "Cleanup is limited to exact files in this chat's tmp folder."}
|
|
65
76
|
)
|
|
66
|
-
|
|
67
|
-
context.runtime.
|
|
68
|
-
|
|
77
|
+
if area == "tasks":
|
|
78
|
+
root = context.runtime.workspace_root / "tasks"
|
|
79
|
+
try:
|
|
80
|
+
task_id = str(UUID(relative.parts[0]))
|
|
81
|
+
except ValueError:
|
|
82
|
+
return context.json_result({"error": "Use <task-id>/<filename> for task notes."})
|
|
83
|
+
if (
|
|
84
|
+
len(relative.parts) < 2
|
|
85
|
+
or relative.parts[0] != task_id
|
|
86
|
+
or root.resolve() != root
|
|
87
|
+
or not (root / task_id).is_dir()
|
|
88
|
+
):
|
|
89
|
+
return context.json_result({"error": "Write inside an existing task folder."})
|
|
90
|
+
else:
|
|
91
|
+
root = (
|
|
92
|
+
context.runtime.home.brain_dir if area == "brain" else context.runtime.home.tmp_dir
|
|
93
|
+
).resolve()
|
|
69
94
|
target = root / relative
|
|
70
95
|
if target.resolve() != target or not target.is_relative_to(root) or target == root:
|
|
71
96
|
return context.json_result(
|