uclone-x 0.2.0__tar.gz → 0.2.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 (302) hide show
  1. {uclone_x-0.2.0 → uclone_x-0.2.2}/CHANGELOG.md +122 -0
  2. {uclone_x-0.2.0 → uclone_x-0.2.2}/PKG-INFO +54 -38
  3. {uclone_x-0.2.0 → uclone_x-0.2.2}/README.md +51 -37
  4. {uclone_x-0.2.0 → uclone_x-0.2.2}/pyproject.toml +7 -1
  5. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/__init__.py +1 -1
  6. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/base.py +263 -23
  7. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/models.py +15 -1
  8. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/prompts.py +16 -0
  9. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/protocols.py +1 -0
  10. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/request_record.py +119 -22
  11. uclone_x-0.2.2/src/uclone_x/agent/turn_trace.py +477 -0
  12. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/a2a.py +5 -1
  13. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/acp.py +6 -1
  14. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/bootstrap.py +132 -22
  15. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/eval.py +3 -1
  16. uclone_x-0.2.2/src/uclone_x/cli/commands/key.py +207 -0
  17. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/llm.py +67 -0
  18. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/loop.py +8 -1
  19. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/media.py +4 -0
  20. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/room.py +23 -4
  21. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/run.py +54 -9
  22. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/main.py +2 -0
  23. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/environment_install.py +1 -1
  24. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/errors.py +23 -0
  25. uclone_x-0.2.2/src/uclone_x/llm/connectors/factory.py +362 -0
  26. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/ollama.py +63 -24
  27. uclone_x-0.2.2/src/uclone_x/llm/connectors/saved_choice.py +346 -0
  28. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/context_window.py +70 -28
  29. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/models.py +41 -1
  30. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/log/reader.py +1 -0
  31. uclone_x-0.2.2/src/uclone_x/personas/artist.yaml +42 -0
  32. uclone_x-0.2.2/src/uclone_x/personas/guardian.yaml +37 -0
  33. uclone_x-0.2.2/src/uclone_x/personas/pioneer.yaml +31 -0
  34. uclone_x-0.2.2/src/uclone_x/personas/scout.yaml +23 -0
  35. uclone_x-0.2.2/src/uclone_x/personas/writer.yaml +23 -0
  36. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/models.py +14 -3
  37. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/orchestrator.py +97 -14
  38. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/selectors.py +28 -6
  39. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/acp/server.py +10 -2
  40. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/__init__.py +6 -0
  41. uclone_x-0.2.2/src/uclone_x/tools/builtin/character.py +330 -0
  42. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/image.py +336 -18
  43. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/registry.py +2 -0
  44. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/app.py +141 -27
  45. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/room_dock.py +239 -8
  46. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/rooms.py +84 -2
  47. uclone_x-0.2.2/src/uclone_x/ui_build_inputs.sha256 +1 -0
  48. uclone_x-0.2.2/src/uclone_x/ui_static/assets/index-B26a-pug.js +836 -0
  49. uclone_x-0.2.0/src/uclone_x/ui_static/assets/index-Dvw1Fh4L.css → uclone_x-0.2.2/src/uclone_x/ui_static/assets/index-uisJBy0U.css +1 -1
  50. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/index.html +2 -2
  51. uclone_x-0.2.0/src/uclone_x/llm/connectors/factory.py +0 -155
  52. uclone_x-0.2.0/src/uclone_x/personas/artist.yaml +0 -21
  53. uclone_x-0.2.0/src/uclone_x/personas/guardian.yaml +0 -20
  54. uclone_x-0.2.0/src/uclone_x/personas/pioneer.yaml +0 -20
  55. uclone_x-0.2.0/src/uclone_x/personas/scout.yaml +0 -16
  56. uclone_x-0.2.0/src/uclone_x/personas/writer.yaml +0 -18
  57. uclone_x-0.2.0/src/uclone_x/ui_build_inputs.sha256 +0 -1
  58. uclone_x-0.2.0/src/uclone_x/ui_static/assets/index-D1EUl9d1.js +0 -834
  59. {uclone_x-0.2.0 → uclone_x-0.2.2}/.gitignore +0 -0
  60. {uclone_x-0.2.0 → uclone_x-0.2.2}/LICENSE +0 -0
  61. {uclone_x-0.2.0 → uclone_x-0.2.2}/NOTICE +0 -0
  62. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/__init__.py +0 -0
  63. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/discovery.py +0 -0
  64. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/http_transport.py +0 -0
  65. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/in_memory.py +0 -0
  66. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/models.py +0 -0
  67. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/protocols.py +0 -0
  68. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/a2a/wire.py +0 -0
  69. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/acp/__init__.py +0 -0
  70. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/acp/conformance.py +0 -0
  71. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/adapters/__init__.py +0 -0
  72. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/adapters/uclone2/__init__.py +0 -0
  73. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/adapters/uclone2/adk_content.py +0 -0
  74. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/__init__.py +0 -0
  75. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/bootstrap.py +0 -0
  76. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/composition.py +0 -0
  77. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/grounding.py +0 -0
  78. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/__init__.py +0 -0
  79. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/artifact_validation.py +0 -0
  80. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/models.py +0 -0
  81. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/permission.py +0 -0
  82. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/protocols.py +0 -0
  83. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/runner.py +0 -0
  84. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/hooks/script_runner.py +0 -0
  85. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/loop/__init__.py +0 -0
  86. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/loop/models.py +0 -0
  87. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/loop/parser.py +0 -0
  88. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/loop/runner.py +0 -0
  89. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/loop/scheduler.py +0 -0
  90. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/memory.py +0 -0
  91. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/persona_registry.py +0 -0
  92. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/persona_store.py +0 -0
  93. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/planner.py +0 -0
  94. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/session.py +0 -0
  95. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/terminology.py +0 -0
  96. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/agent/text_tool_calls.py +0 -0
  97. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/__init__.py +0 -0
  98. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/agent_memory.py +0 -0
  99. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/bundle_freshness.py +0 -0
  100. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/changed_scope.py +0 -0
  101. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/__init__.py +0 -0
  102. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/dev.py +0 -0
  103. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/ontology.py +0 -0
  104. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/report.py +0 -0
  105. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/session_dev.py +0 -0
  106. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/skill.py +0 -0
  107. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/commands/ui.py +0 -0
  108. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/environment_provenance.py +0 -0
  109. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/cli/quality_gate.py +0 -0
  110. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/__init__.py +0 -0
  111. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/ast_parser.py +0 -0
  112. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/models.py +0 -0
  113. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/protocols.py +0 -0
  114. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/scip.py +0 -0
  115. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/code_intel/symbol_graph.py +0 -0
  116. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/config/default_models.yaml +0 -0
  117. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/__init__.py +0 -0
  118. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/agent_home.py +0 -0
  119. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/capability.py +0 -0
  120. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/client_driver.py +0 -0
  121. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/diagnostic_report.py +0 -0
  122. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/failure_journal.py +0 -0
  123. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/host.py +0 -0
  124. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/immutable.py +0 -0
  125. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/log_inspector.py +0 -0
  126. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/log_offset.py +0 -0
  127. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/log_writer.py +0 -0
  128. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/logging_setup.py +0 -0
  129. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/provenance.py +0 -0
  130. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/secrets.py +0 -0
  131. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/session_diagnostics.py +0 -0
  132. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/session_store.py +0 -0
  133. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/tool_results.py +0 -0
  134. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/core/workspace.py +0 -0
  135. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/engine/__init__.py +0 -0
  136. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/engine/event_bus.py +0 -0
  137. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/engine/mattermost_bridge.py +0 -0
  138. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/engine/protocols.py +0 -0
  139. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/evaluation/__init__.py +0 -0
  140. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/evaluation/answerer.py +0 -0
  141. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/evaluation/loader.py +0 -0
  142. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/evaluation/protocols.py +0 -0
  143. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/__init__.py +0 -0
  144. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/budget.py +0 -0
  145. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/compactor.py +0 -0
  146. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/__init__.py +0 -0
  147. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/anthropic.py +0 -0
  148. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/base.py +0 -0
  149. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/gemini.py +0 -0
  150. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/mock.py +0 -0
  151. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/ollama_embedder.py +0 -0
  152. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/openai.py +0 -0
  153. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/connectors/vllm.py +0 -0
  154. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/protocols.py +0 -0
  155. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/llm/router.py +0 -0
  156. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/log/__init__.py +0 -0
  157. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/log/file_allocator.py +0 -0
  158. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/__init__.py +0 -0
  159. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/models.py +0 -0
  160. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/retrieval.py +0 -0
  161. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/store.py +0 -0
  162. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/tools.py +0 -0
  163. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/memory/vector_store.py +0 -0
  164. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/__init__.py +0 -0
  165. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/engine.py +0 -0
  166. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/justification.py +0 -0
  167. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/models.py +0 -0
  168. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/protocols.py +0 -0
  169. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/reasoner.py +0 -0
  170. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ontology/rules.py +0 -0
  171. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/artist.png +0 -0
  172. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/clone.png +0 -0
  173. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/clone.yaml +0 -0
  174. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/guardian.png +0 -0
  175. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/pioneer.png +0 -0
  176. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/scout.png +0 -0
  177. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/personas/writer.png +0 -0
  178. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/__init__.py +0 -0
  179. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/knowledge.py +0 -0
  180. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/knowledge_store.py +0 -0
  181. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/protocols.py +0 -0
  182. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/resolver.py +0 -0
  183. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/service.py +0 -0
  184. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/store.py +0 -0
  185. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/room/turn_summary.py +0 -0
  186. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/sandbox/__init__.py +0 -0
  187. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/sandbox/models.py +0 -0
  188. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/sandbox/path_validator.py +0 -0
  189. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/sandbox/protocols.py +0 -0
  190. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/sandbox/workspace_runner.py +0 -0
  191. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/a2a_server.py +0 -0
  192. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/acp/__init__.py +0 -0
  193. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/acp/driver.py +0 -0
  194. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/acp/models.py +0 -0
  195. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/entry.py +0 -0
  196. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/shells/ui_process.py +0 -0
  197. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/skills/__init__.py +0 -0
  198. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/skills/auditor.py +0 -0
  199. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/skills/models.py +0 -0
  200. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/skills/protocols.py +0 -0
  201. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/skills/synthesizer.py +0 -0
  202. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/__init__.py +0 -0
  203. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/exporter.py +0 -0
  204. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/langfuse.py +0 -0
  205. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/metrics.py +0 -0
  206. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/models.py +0 -0
  207. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/otel_sdk.py +0 -0
  208. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/otlp.py +0 -0
  209. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/protocols.py +0 -0
  210. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/telemetry/tracer.py +0 -0
  211. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/__init__.py +0 -0
  212. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/base.py +0 -0
  213. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/comfy_client.py +0 -0
  214. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/comfy_image_tool.py +0 -0
  215. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/filesystem.py +0 -0
  216. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/install.py +0 -0
  217. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/mcp_loader.py +0 -0
  218. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/media_registry.py +0 -0
  219. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/plan.py +0 -0
  220. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/shell.py +0 -0
  221. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/skill_loader.py +0 -0
  222. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/subagent.py +0 -0
  223. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/tool_results.py +0 -0
  224. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/builtin/web.py +0 -0
  225. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/client.py +0 -0
  226. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/mcp_manager.py +0 -0
  227. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/models.py +0 -0
  228. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/outcome.py +0 -0
  229. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/protocols.py +0 -0
  230. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/scoped_registry.py +0 -0
  231. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/tools/tool_scoper.py +0 -0
  232. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/__init__.py +0 -0
  233. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/build_inputs.py +0 -0
  234. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/clones.py +0 -0
  235. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/knowledge.py +0 -0
  236. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/server.py +0 -0
  237. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui/single_flight.py +0 -0
  238. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  239. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  240. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  241. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  242. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  243. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  244. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  245. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  246. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  247. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  248. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  249. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  250. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  251. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  252. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  253. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  254. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  255. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  256. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  257. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  258. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  259. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  260. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  261. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  262. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  263. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  264. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  265. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  266. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  267. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  268. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  269. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  270. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  271. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  272. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  273. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  274. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  275. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  276. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  277. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  278. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  279. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  280. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  281. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  282. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  283. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  284. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  285. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  286. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  287. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  288. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  289. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  290. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  291. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  292. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  293. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  294. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  295. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  296. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  297. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/favicon.ico +0 -0
  298. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/logo.png +0 -0
  299. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/logoWhite.png +0 -0
  300. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/logo_uclone_short.png +0 -0
  301. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/uclone_logo_1024x1024.png +0 -0
  302. {uclone_x-0.2.0 → uclone_x-0.2.2}/src/uclone_x/ui_static/uclone_logo_circle.png +0 -0
@@ -13,6 +13,128 @@ names does.
13
13
  Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Each date is
14
14
  the date that version was published.
15
15
 
16
+ ## [0.2.2] - 2026-09-24
17
+
18
+ ### Added
19
+
20
+ - `ucx install` and `ucx start` now save the model they set up as the default, so
21
+ `ucx run`, `ucx room`, `ucx loop`, `ucx acp` and `ucx a2a` use it without `--provider`
22
+ or `--model`, and say which saved model they are using (`ucx acp` and `ucx a2a` on
23
+ stderr). A model already saved, for example in the dashboard's Settings, is kept; when
24
+ it differs from the one setup just prepared, setup says both and how to switch. A
25
+ dashboard that was started with no model picks up a default saved later.
26
+ - `ucx llm use <model>` (with `--provider` and `--base-url`) changes the saved default.
27
+ It is the same setting as the dashboard's Settings. Command-line flags and environment
28
+ variables such as `LLM_PROVIDER`, `OLLAMA_MODEL` or a provider's API key variable still
29
+ come first, and `ucx llm use` says when one of them is set and takes priority.
30
+ - In Settings, the API key field for OpenAI, Anthropic and Gemini links to the page where
31
+ that provider issues keys, warns when a key does not look like one for the chosen
32
+ provider or confirms that its format is right, and removes spaces and one pair of quotes
33
+ from the ends of a pasted key.
34
+ - `ucx key list` shows whether `GEMINI_API_KEY` (or `GOOGLE_API_KEY`),
35
+ `ANTHROPIC_API_KEY` and `OPENAI_API_KEY` are set. `ucx key setup` opens the provider's
36
+ key page and writes the key you paste to a `.env` file: the nearest one in this folder
37
+ or above it, looking no higher than the top of the enclosing git checkout, where it
38
+ creates one if none is found. Outside a git checkout, it creates one in this folder if
39
+ none is found above. UClone-X does not read that file itself; load it into your shell,
40
+ or enter the key in Settings, for the key to be used.
41
+ - Every clone may load the skills approved for it, without `load_skill` in its tool list,
42
+ and Scout can read web pages as well as search.
43
+
44
+ ### Changed
45
+
46
+ - Ollama requests now ask for a 16K-token context window, unless `context_limit` or
47
+ `OLLAMA_CONTEXT_LENGTH` sets another, instead of leaving the size to Ollama, whose own
48
+ default was 4K on the machine the README's figures come from. A clone's request with
49
+ tool results then fits. It costs memory: for `qwen3:8b`, about 1.8 GB more than a 4K
50
+ window (an estimate, not a measurement).
51
+ - The built-in clones Scout, Pioneer, Guardian and Writer have rewritten instructions,
52
+ now written entirely in English; they still answer in the language you write in. With
53
+ a Qwen model, clones are also told not to use tools that change files or other state
54
+ for advice, brainstorming or general reasoning unless you ask for that change, to use
55
+ read-only search and inspection tools when an answer needs evidence from the workspace
56
+ or the web, and to answer in the language of the question. They are told that accuracy
57
+ requirements alone are no reason to decline a reasonable request, to follow your
58
+ instructions and style without imposing their own judgments, to give substantive
59
+ answers, and not to add moral lectures, unsolicited caveats or boilerplate disclaimers.
60
+ - The conversation list shows compact times ("now", "5m", "1d", "2w"), and a row's
61
+ rename and delete buttons appear when you point at the row or move keyboard focus to
62
+ it, so titles have more room.
63
+
64
+ ### Fixed
65
+
66
+ - Local image generation on an NVIDIA card now runs on the GPU in half precision, where
67
+ 0.2.1 ran it on the CPU. The engine tries CUDA, then Apple's MPS, then the CPU;
68
+ `ucx media status` names the device it will use, and image results name the GPU.
69
+ - When less than about 10 GB of GPU memory is free (an estimate), for example because
70
+ Ollama is keeping a model loaded on the same card, the image engine keeps SDXL's parts
71
+ in system memory, moves each onto the card only while it runs, and decodes the image in
72
+ tiles. This needs `accelerate`, which is now installed with the image engine. It is
73
+ slower and can still run out of memory; if it does, the image request fails with a
74
+ plain message and the memory is released, and when `accelerate` is missing the message
75
+ says how to add it.
76
+ - Under WSL2, the free GPU memory used for that decision now counts memory held by other
77
+ processes (read with NVML or `nvidia-smi`), so the image engine switches to the
78
+ low-memory mode when another program holds the card. When neither can be read, it uses
79
+ the low-memory mode.
80
+ - A model that Ollama cannot give tools to (for example `deepseek-r1:14b`) now ends the
81
+ turn with a short message naming the model and suggesting one that can use tools, such
82
+ as `qwen3:8b`, plus where to change it: `--model` for `ucx run`,
83
+ `ucx room retry <id> --model <model>` in a room, and Settings in the dashboard and in an
84
+ ACP client. The dashboard gives that remedy instead of offering a Retry that would fail
85
+ the same way.
86
+ - The one-line install now offers the image engine, which the published package
87
+ includes; 0.2.1 skipped it. When the installer reports success but the engine's core
88
+ packages (Pillow, diffusers, torch and transformers) cannot be imported, it says so
89
+ instead of reporting the engine installed. That check does not cover `accelerate`.
90
+ - Setting up Ollama runs its official installer up to 3 times when the download is cut
91
+ off, with a message between attempts. An attempt that runs out the 15-minute limit is
92
+ not repeated.
93
+ - A saved API key is used only with the provider it was saved for, and changing provider
94
+ with `ucx llm use` keeps it.
95
+
96
+ ### Compatibility
97
+
98
+ - `settings.json` written by 0.2.2 can carry `llm_api_key_provider`, which 0.2.1
99
+ ignores: 0.2.1 applies a saved API key to whichever provider is saved, and a Settings
100
+ save in 0.2.1 removes the field. 0.2.1's terminal commands also do not read the saved
101
+ default.
102
+ - A conversation that contains a turn refused because its model cannot use tools records
103
+ a reason 0.2.1 does not know, so 0.2.1 may not open it.
104
+
105
+ ## [0.2.1] - 2026-09-24
106
+
107
+ ### Added
108
+
109
+ - A one-line install. `curl -fsSL https://raw.githubusercontent.com/UClone-AI/uclone-x/main/install.sh | bash`
110
+ asks its questions on the terminal even when piped, puts a `ucx` command in
111
+ `~/.local/bin` (and says how to add that folder to `PATH` when it is not there), and
112
+ ends by offering to start UClone-X. `--no-start` skips that last question.
113
+ - Autonomous discussion in group chats. A toggle in the conversation header lets the
114
+ clones keep talking among themselves. It pauses while you are not viewing the
115
+ conversation, resumes when you come back, and stops after 20 turns in a row without you.
116
+ - While a clone runs a tool, the conversation shows which one instead of "Thinking...".
117
+ - The artist clone can remember characters: a `character_sheet` tool saves each
118
+ character's look (tags, description, seed) as a file under `characters/` in the
119
+ workspace, reuses it in later images, and combines several saved characters into one
120
+ scene prompt. It now writes image prompts in English and chooses the aspect ratio from
121
+ the subject.
122
+ - In a group chat, the model that picks the next speaker is now told to let another clone
123
+ answer a question one clone asks, instead of ending the exchange, and to start a
124
+ discussion when you ask the clones to talk among themselves.
125
+ - With developer mode on, a turn shows the model calls it made: model, tokens, duration
126
+ and tools called for each, and on expanding one, the request, the tools offered and the
127
+ response.
128
+
129
+ ### Fixed
130
+
131
+ - Choosing the next speaker in a group chat now asks Ollama to turn a reasoning model's
132
+ thinking off (for example Qwen3), so it replies without spending its budget on
133
+ reasoning first. A selector that runs out of tokens now says so instead of reporting a
134
+ missing JSON object.
135
+ - The message shown when no model is available points to Settings, and to `ucx llm status`
136
+ from a terminal, instead of a `./ucx` command that does not exist in an installed copy.
137
+
16
138
  ## [0.2.0] - 2026-09-24
17
139
 
18
140
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: uclone-x
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Next-Generation Event-Driven AI Agent Core & High-Performance Collaboration Framework
5
5
  Author-email: Kenny Lim <kennylim@uclone.net>
6
6
  License-Expression: Apache-2.0
@@ -21,6 +21,7 @@ Requires-Dist: pydantic-settings>=2.2.0
21
21
  Requires-Dist: pydantic>=2.7.0
22
22
  Requires-Dist: pyyaml>=6.0.1
23
23
  Provides-Extra: all
24
+ Requires-Dist: accelerate>=0.31.0; extra == 'all'
24
25
  Requires-Dist: anthropic>=0.25.0; extra == 'all'
25
26
  Requires-Dist: diffusers>=0.31.0; extra == 'all'
26
27
  Requires-Dist: fastapi>=0.110.0; extra == 'all'
@@ -71,6 +72,7 @@ Requires-Dist: anthropic>=0.25.0; extra == 'llm'
71
72
  Requires-Dist: google-genai>=0.1.0; extra == 'llm'
72
73
  Requires-Dist: openai>=1.25.0; extra == 'llm'
73
74
  Provides-Extra: media
75
+ Requires-Dist: accelerate>=0.31.0; extra == 'media'
74
76
  Requires-Dist: diffusers>=0.31.0; extra == 'media'
75
77
  Requires-Dist: pillow>=10.0.0; extra == 'media'
76
78
  Requires-Dist: torch>=2.2.0; extra == 'media'
@@ -101,66 +103,80 @@ Description-Content-Type: text/markdown
101
103
 
102
104
  ## Install
103
105
 
106
+ On macOS or Linux, paste this into a terminal:
107
+
104
108
  ```bash
105
- uv tool install --managed-python --python 3.12 "uclone-x[cli,http]"
106
- ucx --help
109
+ curl -fsSL https://raw.githubusercontent.com/UClone-AI/uclone-x/main/install.sh | bash
107
110
  ```
108
111
 
109
- Or `uvx --managed-python --python 3.12 --from "uclone-x[cli,http]" ucx --help` to try
110
- it without installing anything permanently. Keep both flags: without `--python 3.12` uv
111
- uses the first `python3` on PATH, which on macOS is 3.9, and the install fails; without
112
- `--managed-python` it still runs that `python3` to check its version, and on a Mac
113
- without the Xcode Command Line Tools that opens an install dialog. With both, uv
114
- downloads its own Python 3.12 and touches nothing else.
112
+ That is the whole install. It needs nothing but `curl` — no Python, Homebrew or
113
+ admin rights of its own. It installs the core (~31 MB), then asks before each
114
+ larger download: a private Python 3.12 when your machine has nothing newer than
115
+ 3.10, then a local AI model through Ollama (~1.4–5.2 GB, depending on memory; say
116
+ no to use an API key instead). Ollama's own installer may ask for your password.
117
+ At the end it asks **Start UClone-X now?** — press Enter, answer any remaining
118
+ setup question, and the dashboard opens in your browser at
119
+ <http://127.0.0.1:5180>. The agents work in the folder you ran it from.
115
120
 
116
- The two extras are not optional in practice: `cli` is typer and rich, which the
117
- `ucx` shell is written in, and `http` is FastAPI and uvicorn, which the
118
- dashboard and the A2A gateway serve through. The base install is the runtime
119
- without a shell — usable as a library, and what you want if you are importing
120
- `uclone_x` rather than running `ucx`. Install without them and `ucx` tells you
121
- which one is missing rather than failing obscurely.
121
+ To answer, UClone-X needs a model: the local one above, which needs no account,
122
+ or an API key for OpenAI, Anthropic or Gemini, pasted into the dashboard's
123
+ **Settings**. Nothing needs editing in a file.
122
124
 
123
- Provider SDKs and the heavier stacks are the genuinely optional extras — install
124
- what you use:
125
+ Next time, start it with:
125
126
 
126
127
  ```bash
127
- pip install "uclone-x[llm]" # Gemini, Claude, OpenAI SDKs
128
- pip install "uclone-x[ontology]" # LinkML, rdflib, networkx
129
- pip install "uclone-x[code_intel]" # tree-sitter AST parsing
130
- pip install "uclone-x[all]"
128
+ ucx start
131
129
  ```
132
130
 
133
- Python 3.11 or newer, and every extra resolves on every version of it, 3.13
134
- included. `code_intel` used to be capped at 3.12, because the grammar bundle it
135
- declared — `tree-sitter-languages` — publishes no wheel above cp312, and since
136
- `all` includes `code_intel` that ceiling was `uclone-x[all]`'s too. It now
137
- declares `tree-sitter-language-pack`, which ships cp313 wheels, so neither is
138
- capped. Without the extra the AST parser falls back to Python's own `ast` and
139
- says so.
131
+ If your shell says `command not found`, the installer printed one `export PATH=…`
132
+ line at the end; add it to `~/.zshrc` (or `~/.bashrc`) and open a new terminal.
133
+ Until then, `~/.local/bin/ucx start` works.
134
+
135
+ UClone-X itself lives in `~/.uclone-x` and the `ucx` link in `~/.local/bin`;
136
+ `rm -rf ~/.uclone-x ~/.local/bin/ucx` removes it. What the installer fetched
137
+ alongside it stays: uv (`~/.local/bin/uv`, `uvx`) and the Python it downloaded
138
+ (`uv python uninstall 3.12` removes that), and Ollama with its models.
140
139
 
141
- ## First run
140
+ ### Other ways to install
142
141
 
143
- Configure at least one provider, then start a chat session:
142
+ If you already use [uv](https://docs.astral.sh/uv/):
144
143
 
145
144
  ```bash
146
- cp .env.example .env # then fill in one API key, or point at a local Ollama
147
- ucx run
145
+ uv tool install --managed-python --python 3.12 "uclone-x[cli,http]"
146
+ ucx start
148
147
  ```
149
148
 
150
- `ucx run` is an interactive terminal REPL with streaming responses, tool calls
151
- and slash commands. A local model needs no API key at all:
149
+ Keep both flags: without `--python 3.12` uv uses the first `python3` on PATH,
150
+ which on macOS is 3.9, and the install fails; without `--managed-python` it still
151
+ runs that `python3` to check its version, and on a Mac without the Xcode Command
152
+ Line Tools that opens an install dialog.
153
+
154
+ With pip, into a Python 3.11+ environment of your own:
155
+ `pip install "uclone-x[cli,http]"`. The two extras are not optional in practice:
156
+ `cli` is the `ucx` shell and `http` serves the dashboard. The base install is the
157
+ runtime without a shell — what you want if you are importing `uclone_x` as a
158
+ library. Provider SDKs and the heavier stacks are the genuinely optional extras:
152
159
 
153
160
  ```bash
154
- OLLAMA_FAST_BASE_URL=http://localhost:11434/v1 OLLAMA_FAST_MODEL=qwen3:8b ucx run
161
+ pip install "uclone-x[llm]" # Gemini, Claude, OpenAI SDKs
162
+ pip install "uclone-x[ontology]" # LinkML, rdflib, networkx
163
+ pip install "uclone-x[code_intel]" # tree-sitter AST parsing
164
+ pip install "uclone-x[all]"
155
165
  ```
156
166
 
157
- The dashboard — an agent and event-bus explorer — is a single command:
167
+ Every extra resolves on Python 3.11, 3.12 and 3.13.
168
+
169
+ ### From a terminal
170
+
171
+ `ucx run` is an interactive terminal REPL with streaming responses, tool calls
172
+ and slash commands. It reads its model from the environment — an API key such as
173
+ `OPENAI_API_KEY`, or a local Ollama:
158
174
 
159
175
  ```bash
160
- ucx ui
176
+ OLLAMA_FAST_BASE_URL=http://localhost:11434/v1 OLLAMA_FAST_MODEL=qwen3:8b ucx run
161
177
  ```
162
178
 
163
- It serves a prebuilt interface, so it needs no Node toolchain.
179
+ `ucx llm status` reports which models are reachable.
164
180
 
165
181
  ## What UClone-X is
166
182
 
@@ -14,66 +14,80 @@
14
14
 
15
15
  ## Install
16
16
 
17
+ On macOS or Linux, paste this into a terminal:
18
+
17
19
  ```bash
18
- uv tool install --managed-python --python 3.12 "uclone-x[cli,http]"
19
- ucx --help
20
+ curl -fsSL https://raw.githubusercontent.com/UClone-AI/uclone-x/main/install.sh | bash
20
21
  ```
21
22
 
22
- Or `uvx --managed-python --python 3.12 --from "uclone-x[cli,http]" ucx --help` to try
23
- it without installing anything permanently. Keep both flags: without `--python 3.12` uv
24
- uses the first `python3` on PATH, which on macOS is 3.9, and the install fails; without
25
- `--managed-python` it still runs that `python3` to check its version, and on a Mac
26
- without the Xcode Command Line Tools that opens an install dialog. With both, uv
27
- downloads its own Python 3.12 and touches nothing else.
23
+ That is the whole install. It needs nothing but `curl` — no Python, Homebrew or
24
+ admin rights of its own. It installs the core (~31 MB), then asks before each
25
+ larger download: a private Python 3.12 when your machine has nothing newer than
26
+ 3.10, then a local AI model through Ollama (~1.4–5.2 GB, depending on memory; say
27
+ no to use an API key instead). Ollama's own installer may ask for your password.
28
+ At the end it asks **Start UClone-X now?** — press Enter, answer any remaining
29
+ setup question, and the dashboard opens in your browser at
30
+ <http://127.0.0.1:5180>. The agents work in the folder you ran it from.
28
31
 
29
- The two extras are not optional in practice: `cli` is typer and rich, which the
30
- `ucx` shell is written in, and `http` is FastAPI and uvicorn, which the
31
- dashboard and the A2A gateway serve through. The base install is the runtime
32
- without a shell — usable as a library, and what you want if you are importing
33
- `uclone_x` rather than running `ucx`. Install without them and `ucx` tells you
34
- which one is missing rather than failing obscurely.
32
+ To answer, UClone-X needs a model: the local one above, which needs no account,
33
+ or an API key for OpenAI, Anthropic or Gemini, pasted into the dashboard's
34
+ **Settings**. Nothing needs editing in a file.
35
35
 
36
- Provider SDKs and the heavier stacks are the genuinely optional extras — install
37
- what you use:
36
+ Next time, start it with:
38
37
 
39
38
  ```bash
40
- pip install "uclone-x[llm]" # Gemini, Claude, OpenAI SDKs
41
- pip install "uclone-x[ontology]" # LinkML, rdflib, networkx
42
- pip install "uclone-x[code_intel]" # tree-sitter AST parsing
43
- pip install "uclone-x[all]"
39
+ ucx start
44
40
  ```
45
41
 
46
- Python 3.11 or newer, and every extra resolves on every version of it, 3.13
47
- included. `code_intel` used to be capped at 3.12, because the grammar bundle it
48
- declared — `tree-sitter-languages` — publishes no wheel above cp312, and since
49
- `all` includes `code_intel` that ceiling was `uclone-x[all]`'s too. It now
50
- declares `tree-sitter-language-pack`, which ships cp313 wheels, so neither is
51
- capped. Without the extra the AST parser falls back to Python's own `ast` and
52
- says so.
42
+ If your shell says `command not found`, the installer printed one `export PATH=…`
43
+ line at the end; add it to `~/.zshrc` (or `~/.bashrc`) and open a new terminal.
44
+ Until then, `~/.local/bin/ucx start` works.
45
+
46
+ UClone-X itself lives in `~/.uclone-x` and the `ucx` link in `~/.local/bin`;
47
+ `rm -rf ~/.uclone-x ~/.local/bin/ucx` removes it. What the installer fetched
48
+ alongside it stays: uv (`~/.local/bin/uv`, `uvx`) and the Python it downloaded
49
+ (`uv python uninstall 3.12` removes that), and Ollama with its models.
53
50
 
54
- ## First run
51
+ ### Other ways to install
55
52
 
56
- Configure at least one provider, then start a chat session:
53
+ If you already use [uv](https://docs.astral.sh/uv/):
57
54
 
58
55
  ```bash
59
- cp .env.example .env # then fill in one API key, or point at a local Ollama
60
- ucx run
56
+ uv tool install --managed-python --python 3.12 "uclone-x[cli,http]"
57
+ ucx start
61
58
  ```
62
59
 
63
- `ucx run` is an interactive terminal REPL with streaming responses, tool calls
64
- and slash commands. A local model needs no API key at all:
60
+ Keep both flags: without `--python 3.12` uv uses the first `python3` on PATH,
61
+ which on macOS is 3.9, and the install fails; without `--managed-python` it still
62
+ runs that `python3` to check its version, and on a Mac without the Xcode Command
63
+ Line Tools that opens an install dialog.
64
+
65
+ With pip, into a Python 3.11+ environment of your own:
66
+ `pip install "uclone-x[cli,http]"`. The two extras are not optional in practice:
67
+ `cli` is the `ucx` shell and `http` serves the dashboard. The base install is the
68
+ runtime without a shell — what you want if you are importing `uclone_x` as a
69
+ library. Provider SDKs and the heavier stacks are the genuinely optional extras:
65
70
 
66
71
  ```bash
67
- OLLAMA_FAST_BASE_URL=http://localhost:11434/v1 OLLAMA_FAST_MODEL=qwen3:8b ucx run
72
+ pip install "uclone-x[llm]" # Gemini, Claude, OpenAI SDKs
73
+ pip install "uclone-x[ontology]" # LinkML, rdflib, networkx
74
+ pip install "uclone-x[code_intel]" # tree-sitter AST parsing
75
+ pip install "uclone-x[all]"
68
76
  ```
69
77
 
70
- The dashboard — an agent and event-bus explorer — is a single command:
78
+ Every extra resolves on Python 3.11, 3.12 and 3.13.
79
+
80
+ ### From a terminal
81
+
82
+ `ucx run` is an interactive terminal REPL with streaming responses, tool calls
83
+ and slash commands. It reads its model from the environment — an API key such as
84
+ `OPENAI_API_KEY`, or a local Ollama:
71
85
 
72
86
  ```bash
73
- ucx ui
87
+ OLLAMA_FAST_BASE_URL=http://localhost:11434/v1 OLLAMA_FAST_MODEL=qwen3:8b ucx run
74
88
  ```
75
89
 
76
- It serves a prebuilt interface, so it needs no Node toolchain.
90
+ `ucx llm status` reports which models are reachable.
77
91
 
78
92
  ## What UClone-X is
79
93
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "uclone-x"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  description = "Next-Generation Event-Driven AI Agent Core & High-Performance Collaboration Framework"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -101,8 +101,14 @@ ontology = [
101
101
  # `ucx media status` reporting ready for an engine that would fail on `import torch`.
102
102
  # The floors here are the same ones `IN_PROCESS_REQUIREMENTS` checks at runtime, so a
103
103
  # beginner who installs this extra and a beginner who follows the hint end up equivalent.
104
+ #
105
+ # `accelerate` is what `enable_model_cpu_offload` needs. It is not a runtime requirement
106
+ # (MPS and CPU never offload, and a CUDA card with room loads the whole pipeline), so it is
107
+ # not in `IN_PROCESS_REQUIREMENTS`; it is here so an NVIDIA card whose memory is shared
108
+ # with a resident Ollama model can still run SDXL instead of running out of memory.
104
109
  media = [
105
110
  "pillow>=10.0.0",
111
+ "accelerate>=0.31.0",
106
112
  "diffusers>=0.31.0",
107
113
  "torch>=2.2.0",
108
114
  "transformers>=4.40.0",
@@ -1,5 +1,5 @@
1
1
  """UClone-X: Next-Generation Event-Driven AI Agent Core & Collaboration Framework."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.2"
4
4
  __author__ = "Kenny Lim <kennylim@uclone.net>"
5
5
  __all__ = ["__version__"]