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.
Files changed (484) hide show
  1. {anomx-2.3.0 → anomx-2.3.2}/PKG-INFO +1 -1
  2. {anomx-2.3.0 → anomx-2.3.2}/pyproject.toml +1 -1
  3. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__init__.py +1 -1
  4. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/mode.py +2 -1
  5. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/platform_client.py +13 -3
  6. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime.py +24 -7
  7. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/__init__.py +1 -0
  8. anomx-2.3.2/src/anomx/agent/skills/create-system-models/SKILL.md +69 -0
  9. anomx-2.3.2/src/anomx/agent/skills/create-system-models/references/model-format.md +57 -0
  10. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/store.py +26 -10
  11. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/__init__.py +2 -0
  12. anomx-2.3.2/src/anomx/agent/tools/manage_tasks.py +100 -0
  13. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/manage_workspace_files.py +35 -10
  14. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/config.py +24 -7
  15. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli.py +4 -1
  16. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_optimization.py +2 -2
  17. anomx-2.3.2/tests/test_agent_manage_tasks.py +95 -0
  18. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_menu.py +11 -4
  19. anomx-2.3.2/tests/test_agent_platform_timeouts.py +39 -0
  20. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_skill_files.py +5 -1
  21. anomx-2.3.2/tests/test_agent_task_models.py +56 -0
  22. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_files.py +45 -0
  23. {anomx-2.3.0 → anomx-2.3.2}/tests/test_package.py +2 -2
  24. {anomx-2.3.0 → anomx-2.3.2}/.github/workflows/ci.yml +0 -0
  25. {anomx-2.3.0 → anomx-2.3.2}/.gitignore +0 -0
  26. {anomx-2.3.0 → anomx-2.3.2}/.pre-commit-config.yaml +0 -0
  27. {anomx-2.3.0 → anomx-2.3.2}/AGENTS.md +0 -0
  28. {anomx-2.3.0 → anomx-2.3.2}/CHANGELOG.md +0 -0
  29. {anomx-2.3.0 → anomx-2.3.2}/CONTRIBUTING.md +0 -0
  30. {anomx-2.3.0 → anomx-2.3.2}/LICENSE +0 -0
  31. {anomx-2.3.0 → anomx-2.3.2}/README.md +0 -0
  32. {anomx-2.3.0 → anomx-2.3.2}/THIRD_PARTY_NOTICES.md +0 -0
  33. {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-01.png +0 -0
  34. {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-02.png +0 -0
  35. {anomx-2.3.0 → anomx-2.3.2}/assets/anomx-shot-03.png +0 -0
  36. {anomx-2.3.0 → anomx-2.3.2}/assets/logo-dark.png +0 -0
  37. {anomx-2.3.0 → anomx-2.3.2}/assets/logo-light.png +0 -0
  38. {anomx-2.3.0 → anomx-2.3.2}/assets/logo.png +0 -0
  39. {anomx-2.3.0 → anomx-2.3.2}/docs/api.md +0 -0
  40. {anomx-2.3.0 → anomx-2.3.2}/docs/architecture.md +0 -0
  41. {anomx-2.3.0 → anomx-2.3.2}/docs/context-management.md +0 -0
  42. {anomx-2.3.0 → anomx-2.3.2}/docs/datasets.md +0 -0
  43. {anomx-2.3.0 → anomx-2.3.2}/docs/flexible-jobs.md +0 -0
  44. {anomx-2.3.0 → anomx-2.3.2}/docs/index.md +0 -0
  45. {anomx-2.3.0 → anomx-2.3.2}/docs/local-experiments.md +0 -0
  46. {anomx-2.3.0 → anomx-2.3.2}/docs/models-and-detection.md +0 -0
  47. {anomx-2.3.0 → anomx-2.3.2}/docs/native-daq.md +0 -0
  48. {anomx-2.3.0 → anomx-2.3.2}/docs/processing-and-metrics.md +0 -0
  49. {anomx-2.3.0 → anomx-2.3.2}/docs/runs.md +0 -0
  50. {anomx-2.3.0 → anomx-2.3.2}/docs/timeseries.md +0 -0
  51. {anomx-2.3.0 → anomx-2.3.2}/examples/baseline_detection.py +0 -0
  52. {anomx-2.3.0 → anomx-2.3.2}/examples/flexible_job_training.py +0 -0
  53. {anomx-2.3.0 → anomx-2.3.2}/examples/naive_forecast.py +0 -0
  54. {anomx-2.3.0 → anomx-2.3.2}/licenses/DARTS-APACHE-2.0.txt +0 -0
  55. {anomx-2.3.0 → anomx-2.3.2}/mkdocs.yml +0 -0
  56. {anomx-2.3.0 → anomx-2.3.2}/release.sh +0 -0
  57. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__init__.pyi +0 -0
  58. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/__main__.py +0 -0
  59. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_logging.py +0 -0
  60. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_typing.py +0 -0
  61. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/__init__.py +0 -0
  62. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_formatting.py +0 -0
  63. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_lazy.py +0 -0
  64. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/_plotting.py +0 -0
  65. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/likelihood_models/__init__.py +0 -0
  66. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/likelihood_models/base.py +0 -0
  67. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/missing_values.py +0 -0
  68. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/timeseries_generation.py +0 -0
  69. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/ts_utils.py +0 -0
  70. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_series_utils/utils.py +0 -0
  71. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/_shared.py +0 -0
  72. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/__init__.py +0 -0
  73. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/__init__.pyi +0 -0
  74. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/__init__.py +0 -0
  75. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/main_agent.py +0 -0
  76. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/platform_agent.py +0 -0
  77. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/agents/sub_agent.py +0 -0
  78. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/app.py +0 -0
  79. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/__init__.py +0 -0
  80. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/anthropic.py +0 -0
  81. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/blablador.py +0 -0
  82. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/desy_assistant.py +0 -0
  83. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/kimi.py +0 -0
  84. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/ollama.py +0 -0
  85. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/openai.py +0 -0
  86. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/backends/openai_chat.py +0 -0
  87. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/__init__.py +0 -0
  88. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/__init__.pyi +0 -0
  89. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/agents.py +0 -0
  90. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/backends.py +0 -0
  91. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/exceptions.py +0 -0
  92. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/interactions.py +0 -0
  93. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/processes.py +0 -0
  94. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/subagents.py +0 -0
  95. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/base/tools.py +0 -0
  96. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/brain.py +0 -0
  97. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/command_mode.py +0 -0
  98. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/context_management.py +0 -0
  99. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/__init__.py +0 -0
  100. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/backends.py +0 -0
  101. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/exceptions/tools.py +0 -0
  102. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/file_reference_search.py +0 -0
  103. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/__init__.py +0 -0
  104. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/anomx_api.py +0 -0
  105. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/approval.py +0 -0
  106. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/container_runtime.py +0 -0
  107. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/debug.py +0 -0
  108. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/delegation.py +0 -0
  109. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/extract_json.py +0 -0
  110. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/file_activity.py +0 -0
  111. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/local_sandbox.py +0 -0
  112. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/pending_approvals.py +0 -0
  113. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/read_only_python.py +0 -0
  114. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/sandbox.py +0 -0
  115. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/state.py +0 -0
  116. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/terminal.py +0 -0
  117. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/terminal_colors.py +0 -0
  118. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/tool_manager.py +0 -0
  119. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/tool_results.py +0 -0
  120. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/utils.py +0 -0
  121. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/helpers/workspace_storage.py +0 -0
  122. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/memories.py +0 -0
  123. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/model_catalog.py +0 -0
  124. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/Dockerfile +0 -0
  125. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/install-tools.sh +0 -0
  126. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_image/requirements.txt +0 -0
  127. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/runtime_process.py +0 -0
  128. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/browse-files/SKILL.md +0 -0
  129. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/create-dataset/SKILL.md +0 -0
  130. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/create-dataset/references/sources.md +0 -0
  131. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/edit-workspace/SKILL.md +0 -0
  132. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/files.py +0 -0
  133. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-acquisition/SKILL.md +0 -0
  134. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-data/SKILL.md +0 -0
  135. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-integrations/SKILL.md +0 -0
  136. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-jobs/SKILL.md +0 -0
  137. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-jobs/references/jobs.md +0 -0
  138. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-recommendations/SKILL.md +0 -0
  139. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-systems/SKILL.md +0 -0
  140. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/manage-systems/references/contracts.md +0 -0
  141. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/retrieve-data/SKILL.md +0 -0
  142. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/SKILL.md +0 -0
  143. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/compute-work.py +0 -0
  144. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/forecast.py +0 -0
  145. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/lstm-model.py +0 -0
  146. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/assets/native-forecast.py +0 -0
  147. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/architectures.md +0 -0
  148. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/data-and-forecasting.md +0 -0
  149. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/findings.md +0 -0
  150. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/job-synthesis.md +0 -0
  151. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/jobs-and-work.md +0 -0
  152. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/scheduling.md +0 -0
  153. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/training.md +0 -0
  154. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/train-models/references/verification.md +0 -0
  155. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/use-anomx-api/SKILL.md +0 -0
  156. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/use-anomx-api/api.py +0 -0
  157. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/skills/write-work/SKILL.md +0 -0
  158. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/startup.py +0 -0
  159. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/anomx_platform.py +0 -0
  160. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/ask_question.py +0 -0
  161. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/chat_tabs.py +0 -0
  162. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/chat_with_users.py +0 -0
  163. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/check_approval.py +0 -0
  164. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/check_command_status.py +0 -0
  165. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/cli_command.py +0 -0
  166. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/compress_context.py +0 -0
  167. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/create_plan.py +0 -0
  168. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/data_adapters.py +0 -0
  169. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/end_process.py +0 -0
  170. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/finish_anyways.py +0 -0
  171. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/finish_goal.py +0 -0
  172. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/focus_object.py +0 -0
  173. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/get_subagent_info.py +0 -0
  174. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/glob.py +0 -0
  175. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/grep.py +0 -0
  176. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/kill_command.py +0 -0
  177. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/list_directory.py +0 -0
  178. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/manage_workspace_storage.py +0 -0
  179. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/memorize.py +0 -0
  180. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/mount_folder.py +0 -0
  181. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/output_response.py +0 -0
  182. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/plan_schema.py +0 -0
  183. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/produce_output.py +0 -0
  184. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/prompt_subagent.py +0 -0
  185. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/read_file.py +0 -0
  186. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/remove_plan.py +0 -0
  187. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/remove_subagent.py +0 -0
  188. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/send_feedback.py +0 -0
  189. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/show_object.py +0 -0
  190. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/start_process.py +0 -0
  191. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/start_subagent.py +0 -0
  192. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/update_plan.py +0 -0
  193. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/use_anomx_api.py +0 -0
  194. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/wait.py +0 -0
  195. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/web_fetch.py +0 -0
  196. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/tools/web_search.py +0 -0
  197. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/__init__.py +0 -0
  198. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/activity.py +0 -0
  199. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/__init__.py +0 -0
  200. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/bottom_bar.py +0 -0
  201. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/info_box.py +0 -0
  202. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/messages.py +0 -0
  203. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/popup.py +0 -0
  204. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/components/prompt_bar.py +0 -0
  205. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/constants.py +0 -0
  206. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/features.py +0 -0
  207. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/models.py +0 -0
  208. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/__init__.py +0 -0
  209. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/approve_update.py +0 -0
  210. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/approve_workspace.py +0 -0
  211. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/matrix_loading.py +0 -0
  212. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/onboarding.py +0 -0
  213. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/project.py +0 -0
  214. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/session.py +0 -0
  215. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/views/subagent.py +0 -0
  216. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/agent/ui/wave.py +0 -0
  217. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/__init__.py +0 -0
  218. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/__init__.pyi +0 -0
  219. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/_arrays.py +0 -0
  220. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/capabilities.py +0 -0
  221. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/component.py +0 -0
  222. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/discovery.py +0 -0
  223. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/base/signature.py +0 -0
  224. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/cli.py +0 -0
  225. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/config.py +0 -0
  226. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/console.py +0 -0
  227. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/__init__.py +0 -0
  228. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/__init__.pyi +0 -0
  229. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/_selection.py +0 -0
  230. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/_timestamps.py +0 -0
  231. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/__init__.py +0 -0
  232. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/adapters.py +0 -0
  233. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/characteristics.py +0 -0
  234. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/client.py +0 -0
  235. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/connector.py +0 -0
  236. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/relations.py +0 -0
  237. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/base/transform.py +0 -0
  238. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/cache.py +0 -0
  239. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/dataset.py +0 -0
  240. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/datasets.py +0 -0
  241. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/download.py +0 -0
  242. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/loaders.py +0 -0
  243. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/__init__.py +0 -0
  244. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dataframe.py +0 -0
  245. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/__init__.py +0 -0
  246. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/_plot.py +0 -0
  247. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/cost_matrix.py +0 -0
  248. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/dtw.py +0 -0
  249. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/dtw/window.py +0 -0
  250. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/__init__.py +0 -0
  251. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/encoder_base.py +0 -0
  252. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/encoders/encoders.py +0 -0
  253. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/pipeline.py +0 -0
  254. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/resampling.py +0 -0
  255. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/__init__.py +0 -0
  256. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/base_data_transformer.py +0 -0
  257. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/boxcox.py +0 -0
  258. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/diff.py +0 -0
  259. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/fittable_data_transformer.py +0 -0
  260. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/invertible_data_transformer.py +0 -0
  261. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/mappers.py +0 -0
  262. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/midas.py +0 -0
  263. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/missing_values_filler.py +0 -0
  264. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/reconciliation.py +0 -0
  265. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/scaler.py +0 -0
  266. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/static_covariates_transformer.py +0 -0
  267. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/processing/transformers/window_transformer.py +0 -0
  268. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/__init__.py +0 -0
  269. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/__init__.pyi +0 -0
  270. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/daq.py +0 -0
  271. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/local_fs.py +0 -0
  272. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/mounted.py +0 -0
  273. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/sources/platform.py +0 -0
  274. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/timeseries.py +0 -0
  275. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/__init__.py +0 -0
  276. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/__init__.pyi +0 -0
  277. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/core.py +0 -0
  278. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/observations.py +0 -0
  279. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/data/views/timeseries.py +0 -0
  280. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/__init__.py +0 -0
  281. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/__init__.pyi +0 -0
  282. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/__init__.py +0 -0
  283. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/__init__.pyi +0 -0
  284. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/detectors.py +0 -0
  285. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/base/scorers.py +0 -0
  286. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/__init__.py +0 -0
  287. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/__init__.pyi +0 -0
  288. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/quantile.py +0 -0
  289. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/threshold.py +0 -0
  290. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/detectors/timeseries.py +0 -0
  291. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/generic.py +0 -0
  292. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/pipeline.py +0 -0
  293. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/results.py +0 -0
  294. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/__init__.py +0 -0
  295. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/__init__.pyi +0 -0
  296. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/absolute_error.py +0 -0
  297. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/timeseries.py +0 -0
  298. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/detection/scorers/zscore.py +0 -0
  299. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/__init__.py +0 -0
  300. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/__init__.pyi +0 -0
  301. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/backends/__init__.py +0 -0
  302. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/backends/local.py +0 -0
  303. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/__init__.py +0 -0
  304. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/__init__.pyi +0 -0
  305. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/algorithm.py +0 -0
  306. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/base/tracking.py +0 -0
  307. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/catalog.py +0 -0
  308. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/context.py +0 -0
  309. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/jobs.py +0 -0
  310. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/local.py +0 -0
  311. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/nodes.py +0 -0
  312. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/pipeline.py +0 -0
  313. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/results.py +0 -0
  314. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/runner.py +0 -0
  315. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/runs.py +0 -0
  316. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/__init__.py +0 -0
  317. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/artifacts.py +0 -0
  318. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/data.py +0 -0
  319. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/graph.py +0 -0
  320. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/execution/work/values.py +0 -0
  321. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/helpers/utils/dataset_files.py +0 -0
  322. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/__init__.py +0 -0
  323. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/__init__.pyi +0 -0
  324. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/__init__.py +0 -0
  325. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/__init__.pyi +0 -0
  326. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/adapters.py +0 -0
  327. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/datasets.py +0 -0
  328. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/detectors.py +0 -0
  329. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/models.py +0 -0
  330. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/darts/scorers.py +0 -0
  331. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/__init__.py +0 -0
  332. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/client.py +0 -0
  333. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/datasets.py +0 -0
  334. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/platform/tracking.py +0 -0
  335. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/integrations/workspaces.py +0 -0
  336. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/__init__.py +0 -0
  337. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/metrics.py +0 -0
  338. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/plotting.py +0 -0
  339. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/metrics/utils.py +0 -0
  340. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/__init__.py +0 -0
  341. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/__init__.pyi +0 -0
  342. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/__init__.py +0 -0
  343. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/__init__.pyi +0 -0
  344. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/classifiers.py +0 -0
  345. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/model.py +0 -0
  346. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/base/normality.py +0 -0
  347. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/__init__.py +0 -0
  348. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/__init__.pyi +0 -0
  349. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/constant.py +0 -0
  350. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/darts_naive_seasonal.py +0 -0
  351. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/native.py +0 -0
  352. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/forecasting/rolling_window.py +0 -0
  353. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/generic.py +0 -0
  354. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/onnx.py +0 -0
  355. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/__init__.py +0 -0
  356. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/__init__.pyi +0 -0
  357. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/pca.py +0 -0
  358. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/reconstruction/torch_autoencoder.py +0 -0
  359. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/__init__.py +0 -0
  360. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/__init__.pyi +0 -0
  361. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/representation/isolation_forest.py +0 -0
  362. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/results.py +0 -0
  363. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/models/torch.py +0 -0
  364. {anomx-2.3.0 → anomx-2.3.2}/src/anomx/py.typed +0 -0
  365. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/__init__.py +0 -0
  366. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/conftest.py +0 -0
  367. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/__init__.py +0 -0
  368. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_classification_metrics.py +0 -0
  369. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_metrics.py +0 -0
  370. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/metrics/test_plotting.py +0 -0
  371. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/parametrize_helpers.py +0 -0
  372. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/__init__.py +0 -0
  373. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/dtw/__init__.py +0 -0
  374. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/dtw/test_dtw.py +0 -0
  375. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/__init__.py +0 -0
  376. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/test_covariate_index_generators.py +0 -0
  377. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/encoders/test_encoders.py +0 -0
  378. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/test_pipeline.py +0 -0
  379. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/__init__.py +0 -0
  380. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_base_data_transformer.py +0 -0
  381. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_boxcox.py +0 -0
  382. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_data_transformer.py +0 -0
  383. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_diff.py +0 -0
  384. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_fittable_data_transformer.py +0 -0
  385. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_invertible_data_transformer.py +0 -0
  386. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_invertible_fittable_data_transformer.py +0 -0
  387. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_mappers.py +0 -0
  388. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_midas.py +0 -0
  389. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_missing_values_filler.py +0 -0
  390. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_reconciliation.py +0 -0
  391. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_static_covariates_transformer.py +0 -0
  392. {anomx-2.3.0 → anomx-2.3.2}/tests/native_processing_metrics/processing/transformers/test_window_transformations.py +0 -0
  393. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_activity_presentation.py +0 -0
  394. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_activity_wave.py +0 -0
  395. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_anomx_api.py +0 -0
  396. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_approval_policy.py +0 -0
  397. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_background_approvals.py +0 -0
  398. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_brain.py +0 -0
  399. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_chat_tabs.py +0 -0
  400. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_chat_with_users.py +0 -0
  401. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli_experience.py +0 -0
  402. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_cli_sandbox_lifecycle.py +0 -0
  403. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_command_mode.py +0 -0
  404. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_config_navigation.py +0 -0
  405. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_container_runtime.py +0 -0
  406. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_budget.py +0 -0
  407. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_failures.py +0 -0
  408. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_lifecycle.py +0 -0
  409. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_context_policy.py +0 -0
  410. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_data_adapters.py +0 -0
  411. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_discovery_context.py +0 -0
  412. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_file_activity.py +0 -0
  413. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_focus_and_live_mode.py +0 -0
  414. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_forecast_template.py +0 -0
  415. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_goal_and_delegation.py +0 -0
  416. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_interruption_recovery.py +0 -0
  417. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_kimi.py +0 -0
  418. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_migration_recovery.py +0 -0
  419. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_migration_startup.py +0 -0
  420. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_catalog.py +0 -0
  421. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_model_retries.py +0 -0
  422. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_native_forecast_template.py +0 -0
  423. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_optional_questions.py +0 -0
  424. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_pending_approvals.py +0 -0
  425. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_persistent_sandbox.py +0 -0
  426. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_platform_discovery.py +0 -0
  427. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_produce_output.py +0 -0
  428. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_project_design.py +0 -0
  429. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_question_ui.py +0 -0
  430. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_reasoning.py +0 -0
  431. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_result_files.py +0 -0
  432. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_roles_and_platform_tools.py +0 -0
  433. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_runtime_process.py +0 -0
  434. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_stream_phases.py +0 -0
  435. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_terminal_colors.py +0 -0
  436. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_updates.py +0 -0
  437. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_usage.py +0 -0
  438. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_work_visualization.py +0 -0
  439. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_layout.py +0 -0
  440. {anomx-2.3.0 → anomx-2.3.2}/tests/test_agent_workspace_storage.py +0 -0
  441. {anomx-2.3.0 → anomx-2.3.2}/tests/test_architecture.py +0 -0
  442. {anomx-2.3.0 → anomx-2.3.2}/tests/test_base.py +0 -0
  443. {anomx-2.3.0 → anomx-2.3.2}/tests/test_components.py +0 -0
  444. {anomx-2.3.0 → anomx-2.3.2}/tests/test_daq_reader.py +0 -0
  445. {anomx-2.3.0 → anomx-2.3.2}/tests/test_darts_foundations.py +0 -0
  446. {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_cache.py +0 -0
  447. {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_download_cache.py +0 -0
  448. {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_file_selection.py +0 -0
  449. {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_selection.py +0 -0
  450. {anomx-2.3.0 → anomx-2.3.2}/tests/test_dataset_sources.py +0 -0
  451. {anomx-2.3.0 → anomx-2.3.2}/tests/test_datasets.py +0 -0
  452. {anomx-2.3.0 → anomx-2.3.2}/tests/test_job_workspace.py +0 -0
  453. {anomx-2.3.0 → anomx-2.3.2}/tests/test_local_execution.py +0 -0
  454. {anomx-2.3.0 → anomx-2.3.2}/tests/test_local_execution_review.py +0 -0
  455. {anomx-2.3.0 → anomx-2.3.2}/tests/test_model_inference.py +0 -0
  456. {anomx-2.3.0 → anomx-2.3.2}/tests/test_mounted_datasets.py +0 -0
  457. {anomx-2.3.0 → anomx-2.3.2}/tests/test_native_detection.py +0 -0
  458. {anomx-2.3.0 → anomx-2.3.2}/tests/test_native_forecasting.py +0 -0
  459. {anomx-2.3.0 → anomx-2.3.2}/tests/test_platform_client.py +0 -0
  460. {anomx-2.3.0 → anomx-2.3.2}/tests/test_platform_datasets.py +0 -0
  461. {anomx-2.3.0 → anomx-2.3.2}/tests/test_processing.py +0 -0
  462. {anomx-2.3.0 → anomx-2.3.2}/tests/test_public_stubs.py +0 -0
  463. {anomx-2.3.0 → anomx-2.3.2}/tests/test_pytorch_model.py +0 -0
  464. {anomx-2.3.0 → anomx-2.3.2}/tests/test_runs.py +0 -0
  465. {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_artifacts.py +0 -0
  466. {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_context.py +0 -0
  467. {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_dataset.py +0 -0
  468. {anomx-2.3.0 → anomx-2.3.2}/tests/test_work_graph.py +0 -0
  469. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/__init__.py +0 -0
  470. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/conftest.py +0 -0
  471. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/parametrize_helpers.py +0 -0
  472. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_config.py +0 -0
  473. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_missing_values.py +0 -0
  474. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_native_boundary.py +0 -0
  475. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries.py +0 -0
  476. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_generation.py +0 -0
  477. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_multivariate.py +0 -0
  478. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_plot.py +0 -0
  479. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_plotly.py +0 -0
  480. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_repr_formatting.py +0 -0
  481. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_timeseries_static_covariates.py +0 -0
  482. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_ts_utils.py +0 -0
  483. {anomx-2.3.0 → anomx-2.3.2}/tests/timeseries_baseline/test_utils.py +0 -0
  484. {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.0
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.0"
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"
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from importlib import import_module
6
6
  from typing import Any
7
7
 
8
- __version__ = "2.3.0"
8
+ __version__ = "2.3.2"
9
9
 
10
10
  _EXPORTS = {
11
11
  "NormScorer": "anomx.detection",
@@ -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, and delete exact 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=DEFAULT_TIMEOUT_SECONDS) as response:
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
- raise PlatformClientError(f"Could not reach the platform: {exc.reason}") from exc
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("Timed out while connecting to the platform.") from exc
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("background_easy_work_model")
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("background_easy_work_model")
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("background_easy_work_model")
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("background_easy_work_model")
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("background_hard_work_model")
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("background_medium_work_model")
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("background_easy_work_model")
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}")
@@ -37,6 +37,7 @@ DEFAULT_PLATFORM_SKILL_COMMANDS = (
37
37
  "edit-workspace",
38
38
  "write-work",
39
39
  "manage-systems",
40
+ "create-system-models",
40
41
  )
41
42
  _COMMAND_PATTERN = re.compile(r"^[a-z0-9][a-z0-9_-]{0,63}$")
42
43
 
@@ -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 standard model used for one task difficulty."""
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 automatic naming",
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 BACKGROUND_WORK_MODEL_SETTINGS},
574
- **{setting.effort_key: "" for setting in BACKGROUND_WORK_MODEL_SETTINGS},
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 BACKGROUND_WORK_MODEL_SETTINGS),
612
- *(setting.effort_key for setting in BACKGROUND_WORK_MODEL_SETTINGS),
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 BACKGROUND_WORK_MODEL_SETTINGS:
1350
+ for setting in MODEL_SETTINGS:
1335
1351
  if not str(config.get(setting.config_key) or "").strip():
1336
- config[setting.config_key] = CURRENT_MODEL_SELECTION
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 BACKGROUND_WORK_MODEL_SETTINGS:
1387
+ for setting in MODEL_SETTINGS:
1372
1388
  if not str(merged.get(setting.config_key) or "").strip():
1373
- merged[setting.config_key] = CURRENT_MODEL_SELECTION
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": {"type": "string", "enum": ["brain", "tmp"]},
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
- if area not in {"brain", "tmp"} or action not in {"write", "delete"}:
53
- return context.json_result({"error": "Choose brain/tmp and write/delete."})
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
- root = (
67
- context.runtime.home.brain_dir if area == "brain" else context.runtime.home.tmp_dir
68
- ).resolve()
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(