uclone-x 0.2.2__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. {uclone_x-0.2.2 → uclone_x-0.3.0}/.gitignore +10 -1
  2. {uclone_x-0.2.2 → uclone_x-0.3.0}/CHANGELOG.md +112 -0
  3. {uclone_x-0.2.2 → uclone_x-0.3.0}/PKG-INFO +184 -68
  4. uclone_x-0.3.0/README.md +320 -0
  5. {uclone_x-0.2.2 → uclone_x-0.3.0}/pyproject.toml +13 -2
  6. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/__init__.py +1 -1
  7. uclone_x-0.3.0/src/uclone_x/agent/avatar_tool.py +112 -0
  8. uclone_x-0.3.0/src/uclone_x/agent/base.py +2259 -0
  9. uclone_x-0.3.0/src/uclone_x/agent/clone_builder.py +417 -0
  10. uclone_x-0.3.0/src/uclone_x/agent/compaction_driver.py +564 -0
  11. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/composition.py +33 -5
  12. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/artifact_validation.py +56 -8
  13. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/runner.py +41 -1
  14. uclone_x-0.3.0/src/uclone_x/agent/image_set_planner.py +375 -0
  15. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/loop/__init__.py +4 -0
  16. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/loop/parser.py +49 -19
  17. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/models.py +78 -144
  18. uclone_x-0.3.0/src/uclone_x/agent/nudges.py +280 -0
  19. uclone_x-0.3.0/src/uclone_x/agent/persona_avatar.py +363 -0
  20. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/persona_store.py +24 -2
  21. uclone_x-0.3.0/src/uclone_x/agent/prompt_assembler.py +701 -0
  22. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/protocols.py +24 -0
  23. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/request_record.py +1 -1
  24. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/session.py +31 -577
  25. uclone_x-0.3.0/src/uclone_x/agent/session_lifecycle.py +983 -0
  26. uclone_x-0.3.0/src/uclone_x/agent/tool_execution.py +786 -0
  27. uclone_x-0.3.0/src/uclone_x/agent/tool_invoker.py +413 -0
  28. uclone_x-0.3.0/src/uclone_x/agent/turn_executor.py +2485 -0
  29. uclone_x-0.3.0/src/uclone_x/artifacts/__init__.py +6 -0
  30. uclone_x-0.3.0/src/uclone_x/artifacts/library.py +938 -0
  31. uclone_x-0.3.0/src/uclone_x/cli/browser_plan.py +356 -0
  32. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/changed_scope.py +118 -44
  33. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/a2a.py +31 -15
  34. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/acp.py +29 -23
  35. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/bootstrap.py +5 -95
  36. uclone_x-0.3.0/src/uclone_x/cli/commands/key.py +217 -0
  37. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/llm.py +38 -3
  38. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/loop.py +31 -29
  39. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/media.py +35 -1
  40. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/room.py +35 -17
  41. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/run.py +98 -44
  42. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/session_dev.py +4 -1
  43. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/skill.py +197 -68
  44. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/main.py +53 -12
  45. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/quality_gate.py +135 -28
  46. uclone_x-0.3.0/src/uclone_x/cli/scope_rules.py +208 -0
  47. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/ast_parser.py +52 -31
  48. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/config/default_models.yaml +8 -7
  49. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/__init__.py +8 -4
  50. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/environment_install.py +3 -1
  51. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/log_writer.py +7 -18
  52. uclone_x-0.3.0/src/uclone_x/core/models.py +196 -0
  53. uclone_x-0.3.0/src/uclone_x/core/remote_worker.py +667 -0
  54. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/secrets.py +18 -0
  55. uclone_x-0.3.0/src/uclone_x/core/session.py +186 -0
  56. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/session_diagnostics.py +39 -18
  57. uclone_x-0.3.0/src/uclone_x/core/session_state.py +460 -0
  58. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/session_store.py +1 -1
  59. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/tool_results.py +96 -23
  60. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/errors.py +250 -4
  61. uclone_x-0.3.0/src/uclone_x/i18n/__init__.py +21 -0
  62. uclone_x-0.3.0/src/uclone_x/i18n/language.py +71 -0
  63. uclone_x-0.3.0/src/uclone_x/llm/__init__.py +146 -0
  64. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/budget.py +45 -68
  65. uclone_x-0.3.0/src/uclone_x/llm/catalog.py +172 -0
  66. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/compactor.py +66 -48
  67. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/anthropic.py +82 -31
  68. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/base.py +82 -1
  69. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/factory.py +237 -118
  70. uclone_x-0.3.0/src/uclone_x/llm/connectors/failures.py +128 -0
  71. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/gemini.py +200 -32
  72. uclone_x-0.3.0/src/uclone_x/llm/connectors/listing.py +93 -0
  73. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/mock.py +12 -2
  74. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/ollama.py +45 -16
  75. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/openai.py +91 -54
  76. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/saved_choice.py +184 -38
  77. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/vllm.py +6 -12
  78. uclone_x-0.3.0/src/uclone_x/llm/model_policy.py +92 -0
  79. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/models.py +13 -3
  80. uclone_x-0.3.0/src/uclone_x/llm/providers.py +174 -0
  81. uclone_x-0.3.0/src/uclone_x/llm/usage/__init__.py +5 -0
  82. uclone_x-0.3.0/src/uclone_x/llm/usage/gate.py +237 -0
  83. uclone_x-0.3.0/src/uclone_x/llm/usage/limits.py +313 -0
  84. uclone_x-0.3.0/src/uclone_x/llm/usage/store.py +169 -0
  85. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/log/reader.py +2 -1
  86. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/models.py +22 -1
  87. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/store.py +118 -10
  88. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/tools.py +3 -0
  89. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/engine.py +3 -1
  90. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/rules.py +3 -1
  91. uclone_x-0.3.0/src/uclone_x/personas/artist.yaml +50 -0
  92. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/clone.yaml +9 -0
  93. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/guardian.yaml +1 -0
  94. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/pioneer.yaml +1 -0
  95. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/scout.yaml +1 -0
  96. uclone_x-0.3.0/src/uclone_x/personas/writer.yaml +40 -0
  97. uclone_x-0.3.0/src/uclone_x/room/a2a_handlers.py +418 -0
  98. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/knowledge_store.py +1 -1
  99. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/models.py +204 -20
  100. uclone_x-0.3.0/src/uclone_x/room/notices.py +100 -0
  101. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/orchestrator.py +223 -51
  102. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/protocols.py +13 -0
  103. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/resolver.py +144 -126
  104. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/selectors.py +26 -6
  105. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/service.py +96 -5
  106. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/store.py +5 -3
  107. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/turn_summary.py +5 -0
  108. uclone_x-0.3.0/src/uclone_x/sandbox/story_jail.py +169 -0
  109. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/acp/server.py +20 -4
  110. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/skills/__init__.py +6 -0
  111. uclone_x-0.3.0/src/uclone_x/skills/approvals.py +164 -0
  112. uclone_x-0.3.0/src/uclone_x/skills/auditor.py +1245 -0
  113. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/skills/models.py +7 -0
  114. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/skills/protocols.py +32 -6
  115. uclone_x-0.3.0/src/uclone_x/skills/refusals.py +65 -0
  116. uclone_x-0.3.0/src/uclone_x/skills/shipped_pins.py +37 -0
  117. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/skills/synthesizer.py +120 -154
  118. uclone_x-0.3.0/src/uclone_x/story/__init__.py +62 -0
  119. uclone_x-0.3.0/src/uclone_x/story/audit.py +409 -0
  120. uclone_x-0.3.0/src/uclone_x/story/bundled/muse/fantasy.yaml +45 -0
  121. uclone_x-0.3.0/src/uclone_x/story/bundled/muse/horror.yaml +45 -0
  122. uclone_x-0.3.0/src/uclone_x/story/bundled/muse/mystery.yaml +45 -0
  123. uclone_x-0.3.0/src/uclone_x/story/bundled/muse/romance.yaml +45 -0
  124. uclone_x-0.3.0/src/uclone_x/story/bundled/muse/science-fiction.yaml +45 -0
  125. uclone_x-0.3.0/src/uclone_x/story/bundled/structures/heros-journey.yaml +49 -0
  126. uclone_x-0.3.0/src/uclone_x/story/bundled/structures/kishotenketsu.yaml +28 -0
  127. uclone_x-0.3.0/src/uclone_x/story/bundled/structures/save-the-cat.yaml +58 -0
  128. uclone_x-0.3.0/src/uclone_x/story/bundled/structures/three-act.yaml +37 -0
  129. uclone_x-0.3.0/src/uclone_x/story/context.py +787 -0
  130. uclone_x-0.3.0/src/uclone_x/story/library.py +575 -0
  131. uclone_x-0.3.0/src/uclone_x/story/muse.py +195 -0
  132. uclone_x-0.3.0/src/uclone_x/story/proposals.py +337 -0
  133. uclone_x-0.3.0/src/uclone_x/story/quotes.py +98 -0
  134. uclone_x-0.3.0/src/uclone_x/story/schemas.py +510 -0
  135. uclone_x-0.3.0/src/uclone_x/story/skill_data.py +590 -0
  136. uclone_x-0.3.0/src/uclone_x/story/timeline.py +305 -0
  137. uclone_x-0.3.0/src/uclone_x/story/tool.py +232 -0
  138. uclone_x-0.3.0/src/uclone_x/story/tools.py +1188 -0
  139. uclone_x-0.3.0/src/uclone_x/story/view.py +509 -0
  140. uclone_x-0.3.0/src/uclone_x/story/work.py +526 -0
  141. uclone_x-0.3.0/src/uclone_x/tools/base.py +891 -0
  142. uclone_x-0.3.0/src/uclone_x/tools/builtin/a2a.py +276 -0
  143. uclone_x-0.3.0/src/uclone_x/tools/builtin/character.py +602 -0
  144. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/comfy_image_tool.py +4 -4
  145. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/filesystem.py +91 -44
  146. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/image.py +1090 -132
  147. uclone_x-0.3.0/src/uclone_x/tools/builtin/image_set_intent.py +175 -0
  148. uclone_x-0.3.0/src/uclone_x/tools/builtin/image_status.py +198 -0
  149. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/media_registry.py +139 -35
  150. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/shell.py +141 -20
  151. uclone_x-0.3.0/src/uclone_x/tools/builtin/skill_loader.py +231 -0
  152. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/subagent.py +20 -4
  153. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/tool_results.py +2 -2
  154. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/client.py +82 -27
  155. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/mcp_manager.py +106 -41
  156. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/models.py +41 -0
  157. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/registry.py +20 -0
  158. uclone_x-0.3.0/src/uclone_x/tools/schema.py +173 -0
  159. uclone_x-0.3.0/src/uclone_x/tools/tool_binder.py +243 -0
  160. uclone_x-0.3.0/src/uclone_x/tools/tool_scoper.py +159 -0
  161. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/app.py +1399 -2068
  162. uclone_x-0.3.0/src/uclone_x/ui/artifacts.py +203 -0
  163. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/clones.py +4 -4
  164. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/knowledge.py +31 -48
  165. uclone_x-0.3.0/src/uclone_x/ui/person.py +235 -0
  166. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/room_dock.py +115 -32
  167. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/rooms.py +129 -165
  168. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/server.py +22 -3
  169. uclone_x-0.3.0/src/uclone_x/ui/usage.py +176 -0
  170. uclone_x-0.3.0/src/uclone_x/ui_build_inputs.sha256 +1 -0
  171. uclone_x-0.2.2/src/uclone_x/ui_static/assets/index-uisJBy0U.css → uclone_x-0.3.0/src/uclone_x/ui_static/assets/index-BjAyIyi6.css +1 -1
  172. uclone_x-0.3.0/src/uclone_x/ui_static/assets/index-MgVVh250.js +863 -0
  173. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/index.html +2 -2
  174. uclone_x-0.2.2/README.md +0 -210
  175. uclone_x-0.2.2/src/uclone_x/agent/base.py +0 -5931
  176. uclone_x-0.2.2/src/uclone_x/cli/commands/key.py +0 -207
  177. uclone_x-0.2.2/src/uclone_x/llm/__init__.py +0 -95
  178. uclone_x-0.2.2/src/uclone_x/personas/artist.yaml +0 -42
  179. uclone_x-0.2.2/src/uclone_x/personas/writer.yaml +0 -23
  180. uclone_x-0.2.2/src/uclone_x/skills/auditor.py +0 -777
  181. uclone_x-0.2.2/src/uclone_x/tools/base.py +0 -317
  182. uclone_x-0.2.2/src/uclone_x/tools/builtin/character.py +0 -330
  183. uclone_x-0.2.2/src/uclone_x/tools/builtin/skill_loader.py +0 -51
  184. uclone_x-0.2.2/src/uclone_x/tools/tool_scoper.py +0 -294
  185. uclone_x-0.2.2/src/uclone_x/ui_build_inputs.sha256 +0 -1
  186. uclone_x-0.2.2/src/uclone_x/ui_static/assets/index-B26a-pug.js +0 -836
  187. {uclone_x-0.2.2 → uclone_x-0.3.0}/LICENSE +0 -0
  188. {uclone_x-0.2.2 → uclone_x-0.3.0}/NOTICE +0 -0
  189. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/__init__.py +0 -0
  190. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/discovery.py +0 -0
  191. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/http_transport.py +0 -0
  192. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/in_memory.py +0 -0
  193. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/models.py +0 -0
  194. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/protocols.py +0 -0
  195. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/a2a/wire.py +0 -0
  196. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/acp/__init__.py +0 -0
  197. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/acp/conformance.py +0 -0
  198. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/adapters/__init__.py +0 -0
  199. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/adapters/uclone2/__init__.py +0 -0
  200. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/adapters/uclone2/adk_content.py +0 -0
  201. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/__init__.py +0 -0
  202. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/bootstrap.py +0 -0
  203. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/grounding.py +0 -0
  204. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/__init__.py +0 -0
  205. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/models.py +0 -0
  206. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/permission.py +0 -0
  207. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/protocols.py +0 -0
  208. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/hooks/script_runner.py +0 -0
  209. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/loop/models.py +0 -0
  210. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/loop/runner.py +0 -0
  211. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/loop/scheduler.py +0 -0
  212. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/memory.py +0 -0
  213. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/persona_registry.py +0 -0
  214. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/planner.py +0 -0
  215. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/prompts.py +0 -0
  216. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/terminology.py +0 -0
  217. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/text_tool_calls.py +0 -0
  218. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/agent/turn_trace.py +0 -0
  219. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/__init__.py +0 -0
  220. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/agent_memory.py +0 -0
  221. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/bundle_freshness.py +0 -0
  222. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/__init__.py +0 -0
  223. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/dev.py +0 -0
  224. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/eval.py +0 -0
  225. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/ontology.py +0 -0
  226. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/report.py +0 -0
  227. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/commands/ui.py +0 -0
  228. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/cli/environment_provenance.py +0 -0
  229. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/__init__.py +0 -0
  230. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/models.py +0 -0
  231. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/protocols.py +0 -0
  232. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/scip.py +0 -0
  233. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/code_intel/symbol_graph.py +0 -0
  234. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/agent_home.py +0 -0
  235. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/capability.py +0 -0
  236. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/client_driver.py +0 -0
  237. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/diagnostic_report.py +0 -0
  238. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/failure_journal.py +0 -0
  239. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/host.py +0 -0
  240. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/immutable.py +0 -0
  241. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/log_inspector.py +0 -0
  242. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/log_offset.py +0 -0
  243. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/logging_setup.py +0 -0
  244. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/provenance.py +0 -0
  245. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/core/workspace.py +0 -0
  246. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/engine/__init__.py +0 -0
  247. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/engine/event_bus.py +0 -0
  248. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/engine/mattermost_bridge.py +0 -0
  249. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/engine/protocols.py +0 -0
  250. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/evaluation/__init__.py +0 -0
  251. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/evaluation/answerer.py +0 -0
  252. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/evaluation/loader.py +0 -0
  253. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/evaluation/protocols.py +0 -0
  254. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/__init__.py +0 -0
  255. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/connectors/ollama_embedder.py +0 -0
  256. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/context_window.py +0 -0
  257. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/protocols.py +0 -0
  258. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/llm/router.py +0 -0
  259. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/log/__init__.py +0 -0
  260. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/log/file_allocator.py +0 -0
  261. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/__init__.py +0 -0
  262. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/retrieval.py +0 -0
  263. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/memory/vector_store.py +0 -0
  264. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/__init__.py +0 -0
  265. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/justification.py +0 -0
  266. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/models.py +0 -0
  267. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/protocols.py +0 -0
  268. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ontology/reasoner.py +0 -0
  269. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/artist.png +0 -0
  270. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/clone.png +0 -0
  271. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/guardian.png +0 -0
  272. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/pioneer.png +0 -0
  273. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/scout.png +0 -0
  274. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/personas/writer.png +0 -0
  275. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/__init__.py +0 -0
  276. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/room/knowledge.py +0 -0
  277. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/sandbox/__init__.py +0 -0
  278. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/sandbox/models.py +0 -0
  279. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/sandbox/path_validator.py +0 -0
  280. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/sandbox/protocols.py +0 -0
  281. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/sandbox/workspace_runner.py +0 -0
  282. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/a2a_server.py +0 -0
  283. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/acp/__init__.py +0 -0
  284. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/acp/driver.py +0 -0
  285. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/acp/models.py +0 -0
  286. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/entry.py +0 -0
  287. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/shells/ui_process.py +0 -0
  288. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/__init__.py +0 -0
  289. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/exporter.py +0 -0
  290. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/langfuse.py +0 -0
  291. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/metrics.py +0 -0
  292. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/models.py +0 -0
  293. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/otel_sdk.py +0 -0
  294. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/otlp.py +0 -0
  295. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/protocols.py +0 -0
  296. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/telemetry/tracer.py +0 -0
  297. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/__init__.py +0 -0
  298. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/__init__.py +0 -0
  299. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/comfy_client.py +0 -0
  300. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/install.py +0 -0
  301. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/mcp_loader.py +0 -0
  302. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/plan.py +0 -0
  303. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/builtin/web.py +0 -0
  304. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/outcome.py +0 -0
  305. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/protocols.py +0 -0
  306. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/tools/scoped_registry.py +0 -0
  307. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/__init__.py +0 -0
  308. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/build_inputs.py +0 -0
  309. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui/single_flight.py +0 -0
  310. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  311. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  312. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  313. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  314. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  315. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  316. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  317. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  318. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  319. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  320. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  321. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  322. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  323. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  324. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  325. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  326. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  327. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  328. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  329. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  330. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  331. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  332. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  333. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  334. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  335. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  336. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  337. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  338. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  339. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  340. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  341. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  342. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  343. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  344. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  345. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  346. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  347. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  348. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  349. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  350. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  351. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  352. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  353. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  354. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  355. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  356. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  357. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  358. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  359. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  360. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  361. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  362. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  363. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  364. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  365. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  366. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  367. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  368. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  369. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/favicon.ico +0 -0
  370. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/logo.png +0 -0
  371. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/logoWhite.png +0 -0
  372. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/logo_uclone_short.png +0 -0
  373. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/uclone_logo_1024x1024.png +0 -0
  374. {uclone_x-0.2.2 → uclone_x-0.3.0}/src/uclone_x/ui_static/uclone_logo_circle.png +0 -0
@@ -100,5 +100,14 @@ evals/reports/*.json
100
100
  # `artifacts/images/...`, and the UI reads a session's tool output from
101
101
  # `.sandbox/tool_artifacts/<session>/`. Fifty such PNGs were staged by a `git add -A` before
102
102
  # a gate run, and the check that classifies every tracked file refused them.
103
- artifacts/
103
+ # Anchored to the root, where that output lands. Unanchored, `artifacts/` also matched the
104
+ # source directories that share the name (`src/uclone_x/artifacts/`,
105
+ # `frontend/src/components/artifacts/`, #1554), and the public export's commit silently left
106
+ # the frontend one's ten files out. Anchoring covers any later directory of that name too,
107
+ # which per-directory negations did not; `oss.export` now refuses a commit that drops a file.
108
+ /artifacts/
109
+ # The story library (`stories/`, #1555) and the Files screen's archive (`.archive/`, #1554)
110
+ # land beside it for the same reason, anchored for the same reason (#1578).
111
+ /stories/
112
+ /.archive/
104
113
  .sandbox/
@@ -13,6 +13,118 @@ 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.3.0] - 2026-09-27
17
+
18
+ ### Added
19
+
20
+ - Novel co-writing with the Writer. Stories are saved in the workspace as an outline,
21
+ a codex (characters, places, items, threads) and a manuscript, and outlive the
22
+ conversation that started them. New tools `story_library`, `story_outline`,
23
+ `story_codex`, `story_manuscript`, `story_context` and `story_audit` belong to the
24
+ Writer. Only one conversation writes a story at a time; opening it from another gives a
25
+ read-only copy until you take it over. Scenes can carry a `story_time`, so a flashback
26
+ sees the story as it was then. `muse_spark` draws idea cards for a genre.
27
+ - Codex changes the Writer proposes (a death, a lost item) wait for your decision, with
28
+ the quote that shows them. **View story** lists them under "Waiting for your decision"
29
+ with **Approve** and **Reject**; nothing changes until you choose.
30
+ - A **Files** button in the header lists the files clones saved, across every
31
+ conversation, filtered by kind and by conversation. Files can be archived and restored;
32
+ "Delete for good" is offered only on archived files. A story opens in a new
33
+ conversation with its story view.
34
+ - In a one-to-one chat, Clone can ask Writer, Artist, Scout, Pioneer or Guardian for help
35
+ through the new `a2a_call` tool, and Writer can ask Artist for illustrations. A clone
36
+ that is called cannot call a further one.
37
+ - Google Gemini can draw pictures. The `image_engine` setting takes `auto` (the default),
38
+ `local` or `gemini`, and `image_model` picks the Gemini model (default
39
+ `gemini-2.5-flash-image`). On `auto`, Gemini draws only when no local engine or remote
40
+ GPU is ready and your chat already uses Gemini with a saved key; on `local`, no picture
41
+ request leaves your machines. Settings › Images (previously Tools) offers the same
42
+ choice and shows what is drawing pictures now. `ucx media status` lists Gemini too.
43
+ - Clones can have their own pictures. Choose one from a clone's profile ("Upload
44
+ picture…", "Ask {name} to make one", "Reset to default"), or with **Use as avatar**
45
+ under a picture in the conversation, with Undo. Uploads must be PNG, JPEG or WebP and
46
+ 10 MB or smaller. Clones can set their own with the `set_avatar` tool. Pictures show in
47
+ the rail, including the Group Chats list, and in the conversation.
48
+ - Settings has a "Remote GPU Worker (SSH Auto-Tunnel)" section that connects to a
49
+ workstation over SSH and starts ComfyUI there. By default only image generation runs on
50
+ it; tick "Also run the LLM on this worker (Ollama)" to move the chat model too. The
51
+ previous LLM address comes back when you disconnect.
52
+ - Settings › Usage limits how many tokens paid models may use, across every conversation
53
+ and clone, over 10 minutes, 5 hours and a week, with presets or your own numbers. Local
54
+ models are not counted. A banner appears at 80% of a limit. At a limit, the next paid
55
+ call is refused before anything is sent, and the message says when paid models can be
56
+ used again. `UCLONE_USAGE_LIMIT_10_MINUTES`, `UCLONE_USAGE_LIMIT_5_HOURS` and
57
+ `UCLONE_USAGE_LIMIT_WEEK` set the same limits.
58
+ - A "Fast model" for quick background work, such as choosing who speaks next, separate
59
+ from the chat model. It follows the chat model unless you choose one, in Settings or with
60
+ `ucx llm use --fast <model>`.
61
+ - For OpenAI, Anthropic and Gemini, Settings lists the models the provider offers for your
62
+ key, marks one "(recommended)", and has "Refresh list"; it works before you save, and
63
+ says in plain words when the list cannot load. You can still type any model name.
64
+ - `ucx key set <provider>` and `ucx key remove <provider>`; `ucx key list` shows each
65
+ saved key masked and whether an environment variable overrides it.
66
+ - One Language setting (System default, English, Korean). Settings, the rail, the
67
+ conversation, the composer, tool steps and the dock are translated; the Files screen and
68
+ the story view are English only for now. Clones still answer in the language you write in.
69
+ - When a provider refuses a turn, you are told which provider and why (key rejected,
70
+ quota, outage, unreachable, model not available), with a suggested fix.
71
+ - If `ucx-agent-skills` is missing from the project UClone-X was started from, the CLI
72
+ and Settings › Skills say so.
73
+ - The package metadata links to the GitHub repository: homepage, source, issues and this
74
+ changelog.
75
+
76
+ ### Changed
77
+
78
+ - **API keys are saved per provider** in the settings file, so saving or switching one
79
+ provider never drops another's key, and each key is sent only to its own provider. An
80
+ old single saved key is read as its provider's key and rewritten in the new layout the
81
+ next time settings are saved; a key with no known provider is sent nowhere until you save
82
+ it again. `ucx key setup` now saves to the settings file and no longer writes `.env`.
83
+ UClone-X does not read `.env` itself: if you relied on one, load it into your shell or run
84
+ `ucx key set <provider>`.
85
+ - **Environment variables outrank Settings.** `LLM_PROVIDER`, `*_MODEL`, `*_BASE_URL` and
86
+ `*_API_KEY` set in your shell win over saved settings, and Settings, `ucx key` and
87
+ `ucx llm use` say which variable is in effect. `ucx start` no longer sets `LLM_PROVIDER`
88
+ or the model for you, so the ones chosen in Settings take effect; unset your own exports
89
+ to let Settings decide. With no model set anywhere, a request is refused with a plain
90
+ message instead of falling back to a built-in model.
91
+ - The per-session token limit is gone by default; the Usage limits above replace it.
92
+ - **Skills approved before this release must be approved again.** `ucx skill approve` now
93
+ records approvals in `~/.uclone/skills/approvals.json`, asks you to type yes in the
94
+ terminal, and refuses when there is no terminal, so a script or a clone cannot approve a
95
+ skill. A skill edited after approval is not loaded, and Settings › Skills says why each
96
+ skill is not in use.
97
+ - A persona's `allowed_tools` is the range of tools it may use, not a list that is always
98
+ loaded. With a local Ollama model and an embedder, each message gets a base set of tools
99
+ plus up to three matching ones, and a new `search_tools` tool lets the model add others.
100
+ Other providers get every allowed tool.
101
+ - The image prompt skills `media-prompt-danbooru`, `media-prompt-flux` and
102
+ `media-prompt-generic` are replaced by `media-character`, `media-architecture` and
103
+ `media-engineering`, which load the section for the active image model.
104
+ - Removed HTTP routes: `POST /api/turn`, `GET` and `DELETE /api/session/history`,
105
+ `POST /api/session/history/truncate` and `GET /api/agents`. Every conversation runs as a
106
+ room; use the rooms API, and `GET /api/personas` for the list of clones. Saved history is
107
+ kept.
108
+ - Approving codex changes and changing diagnostics consent work only from a browser window
109
+ UClone-X opened; any other window offers "Open a confirmed window".
110
+ - The rail no longer shows which clones are active.
111
+
112
+ ### Fixed
113
+
114
+ - Gemini models can use tools; before, nearly every built-in tool was refused.
115
+ - Ollama's model list uses the address typed in Settings, and says when nothing answers
116
+ there. `localhost`, `127.0.0.1` and `[::1]` on one port count as the same server.
117
+ - A dashboard started with its own storage folder uses the model and usage limits saved
118
+ there.
119
+ - Clicking a clone in the rail no longer jumps to a group chat it is in, and only one clone
120
+ is selected at a time.
121
+ - Typing in the message box no longer redraws the whole conversation on every keystroke.
122
+ - Gemini pictures keep the format Gemini returned (JPEG or PNG), and image links in
123
+ replies open.
124
+ - Shell commands a clone runs no longer wait for keyboard input, `file_edit` keeps a
125
+ file's line endings, a tool call with wrong arguments names each one, and a sandbox that
126
+ cannot start is reported in a plain sentence.
127
+
16
128
  ## [0.2.2] - 2026-09-24
17
129
 
18
130
  ### Added
@@ -1,7 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: uclone-x
3
- Version: 0.2.2
4
- Summary: Next-Generation Event-Driven AI Agent Core & High-Performance Collaboration Framework
3
+ Version: 0.3.0
4
+ Summary: Local AI clones with memory, tools and group chat, on an event-driven agent runtime
5
+ Project-URL: Homepage, https://github.com/UClone-AI/uclone-x
6
+ Project-URL: Documentation, https://github.com/UClone-AI/uclone-x#readme
7
+ Project-URL: Source, https://github.com/UClone-AI/uclone-x
8
+ Project-URL: Issues, https://github.com/UClone-AI/uclone-x/issues
9
+ Project-URL: Changelog, https://github.com/UClone-AI/uclone-x/blob/main/CHANGELOG.md
5
10
  Author-email: Kenny Lim <kennylim@uclone.net>
6
11
  License-Expression: Apache-2.0
7
12
  License-File: LICENSE
@@ -13,6 +18,7 @@ Classifier: License :: OSI Approved :: Apache Software License
13
18
  Classifier: Programming Language :: Python :: 3.11
14
19
  Classifier: Programming Language :: Python :: 3.12
15
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
16
22
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
17
23
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
18
24
  Requires-Python: >=3.11
@@ -91,16 +97,39 @@ Description-Content-Type: text/markdown
91
97
 
92
98
  # ⚡ UClone-X
93
99
 
94
- **Event-driven AI agent core and multi-agent collaboration framework**
100
+ **AI clones that run on your own machine — chat with them one-to-one or in a group,
101
+ and let them remember, read your files, search and draw.**
95
102
 
96
103
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
97
104
  [![Python](https://img.shields.io/badge/Python-3.11+-blue.svg)](https://www.python.org/)
98
- [![LLM Agnostic](https://img.shields.io/badge/LLM-Gemini_|_Claude_|_OpenAI_|_Local-orange.svg)](docs/llm-agnostic-interface.md)
105
+ [![LLM Agnostic](https://img.shields.io/badge/LLM-Gemini_|_Claude_|_OpenAI_|_Local-orange.svg)](https://github.com/UClone-AI/uclone-x/blob/main/docs/llm-agnostic-interface.md)
99
106
 
100
107
  </div>
101
108
 
102
109
  ---
103
110
 
111
+ UClone-X is a local AI workspace. You install it, open the dashboard in your
112
+ browser, and talk to *clones* — agents with their own instructions, memory and
113
+ tools. A local model through Ollama works with no account and no API key; a
114
+ Gemini, Claude or OpenAI key works too.
115
+
116
+ Underneath is an event-driven agent runtime you can also use on its own: see
117
+ [For developers](#for-developers).
118
+
119
+ ## What it looks like
120
+
121
+ Ask a clone a question. Here the default **clone** answers with a structured
122
+ summary on a local model (`ollama:qwen3:8b`):
123
+
124
+ ![A clone answering "Find latest AI technology in september" with a structured list of AI trends](docs/assets/screenshots/research-conversation.webp)
125
+
126
+ Or ask the **artist** clone for a picture. The image appears in the conversation,
127
+ with links to open it in the browser or in Docs:
128
+
129
+ ![The artist clone showing a generated image for "beautiful girl with beautiful background"](docs/assets/screenshots/image-generation.webp)
130
+
131
+ ---
132
+
104
133
  ## Install
105
134
 
106
135
  On macOS or Linux, paste this into a terminal:
@@ -166,19 +195,128 @@ pip install "uclone-x[all]"
166
195
 
167
196
  Every extra resolves on Python 3.11, 3.12 and 3.13.
168
197
 
169
- ### From a terminal
198
+ ### Models
199
+
200
+ `ucx install` downloads the local language model and the image checkpoint and
201
+ checks that each one actually works; it reports a partial setup as incomplete
202
+ rather than as success. You can also do this later from the dashboard.
203
+
204
+ As a rough guide to what fits, from the installer's own advice:
205
+
206
+ | Memory | Local model | Image generation |
207
+ | :--- | :--- | :--- |
208
+ | under 8 GB | use a cloud model (API key) | no |
209
+ | 8–16 GB | `qwen3:1.7b`, or a cloud model | no |
210
+ | 16–24 GB | `qwen3:8b` | 512 px |
211
+ | 24 GB and up | `qwen3:8b` | 768 px |
212
+
213
+ ## Connecting a model
214
+
215
+ Pick **one** of these:
216
+
217
+ * **Local, no key.** Install [Ollama](https://ollama.com). `ucx start` finds it
218
+ and offers a model that fits; models can also be added and removed from
219
+ Settings, or with `ucx llm pull` and `ucx llm rm`.
220
+ * **In the dashboard.** Open Settings, choose Gemini, Anthropic, OpenAI, vLLM or
221
+ Ollama, and enter the key or server address there. It is remembered for the
222
+ next start, in `~/.uclone/sessions/settings.json` as plain text — treat that
223
+ file like the key itself.
224
+ * **From the environment.** `ucx` reads provider settings from environment
225
+ variables, which take precedence over what Settings saved:
226
+
227
+ ```bash
228
+ export ANTHROPIC_API_KEY=... # or GEMINI_API_KEY, OPENAI_API_KEY
229
+ ucx start
230
+ ```
231
+
232
+ `ucx` does **not** read a `.env` file by itself. The repository's
233
+ `.env.example` lists every variable it understands; if you keep yours in a
234
+ `.env`, load it into the shell first (`set -a; . ./.env; set +a`).
235
+
236
+ `ucx llm status` shows which providers it can reach.
237
+
238
+ ## What you can do
239
+
240
+ * **Clones.** Six ship built in — clone (the default), writer, artist,
241
+ guardian, pioneer and scout. Create your own, or edit one, from Settings; the
242
+ connected model can draft its instructions for you. Each clone is a YAML file
243
+ in your workspace.
244
+ * **Conversations.** One-to-one chats and group chats with several clones,
245
+ listed most recent first, with pinning, rename and delete. Replies stream as
246
+ they are written, including each tool call; messages render Markdown and math.
247
+ Group conversations can also be driven from the terminal with `ucx room`.
248
+ * **Memory.** Every clone can record, look up and retract facts, and remembers
249
+ them across conversations. The dock's Remembers tab lists what each clone
250
+ saved.
251
+ * **Files and images.** Clones read files in your workspace and in folders you
252
+ mark read-only, write only inside the workspace, and generate images in-process
253
+ (or through ComfyUI when one is running). What each turn produced appears in
254
+ the dock beside the conversation.
255
+ * **Tools from elsewhere.** Connect MCP servers from Settings — a remote one by
256
+ URL, a local one by command, or by pasting a vendor's `mcpServers` snippet.
257
+ * **The terminal.** `ucx run` is the same agent as an interactive REPL, with
258
+ streaming, tool calls and slash commands; `ucx run --prompt "…"` answers once.
259
+ * **Your editor.** `ucx acp serve` lets an editor that speaks the Agent Client
260
+ Protocol talk to a clone.
261
+
262
+ `ucx --help` lists every command.
263
+
264
+ ## Where your data lives
265
+
266
+ UClone-X has no server of its own and no account. Conversations and dashboard
267
+ settings are kept under `~/.uclone/sessions/` (`UCLONE_SESSION_DIR` moves them),
268
+ each clone's memory under `~/.uclone/agents/` (`UCLONE_AGENTS_DIR`), and clone
269
+ definitions are YAML files in the workspace folder.
270
+
271
+ What leaves the machine is what you connect it to: your messages go to the model
272
+ provider you chose, a web search goes to the search service, and an MCP server
273
+ you add receives what its tools are called with. With a local model and no
274
+ remote tools, nothing leaves at all.
275
+
276
+ ## Something went wrong?
170
277
 
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:
278
+ `ucx` keeps a record of what failed, on your machine, and only if you allow it:
174
279
 
175
280
  ```bash
176
- OLLAMA_FAST_BASE_URL=http://localhost:11434/v1 OLLAMA_FAST_MODEL=qwen3:8b ucx run
281
+ ucx report --enable # start recording failures locally
282
+ ucx report # show what has been recorded
283
+ ucx report --open # open a pre-filled bug report in your browser
177
284
  ```
178
285
 
179
- `ucx llm status` reports which models are reachable.
286
+ **Nothing is uploaded on its own.** There is no telemetry server and no account
287
+ to sign into. `ucx report` prints the exact text that would be sent; `--open`
288
+ fills in a GitHub issue form that you still have to submit yourself. If you have
289
+ the GitHub CLI, `ucx report --submit` files it through your own `gh` login.
290
+
291
+ What gets recorded: the error type, the code path it failed on, your UClone-X,
292
+ Python and OS versions, and the error message. Your prompts and the contents of
293
+ your files are never included, and paths are reduced — code paths to the file
294
+ name, home directories to `~`.
295
+
296
+ Masking is pattern-based, like every credential scrubber: it recognises the
297
+ shapes that occur in practice — `sk-…`, `ghp_…`, home directories on Linux,
298
+ macOS and Windows — and cannot promise to catch a token shape or a path layout
299
+ nobody has seen. That is why `ucx report` shows you the text before anything is
300
+ sent, and why the text is the last word on what leaves your machine.
301
+
302
+ Turn it off with `ucx report --disable` and delete what was recorded with
303
+ `ucx report --clear`.
304
+
305
+ Common first-run problems:
306
+
307
+ * **"No active LLM provider connected."** No model is reachable. Start Ollama
308
+ (`ollama serve`), or set a key in Settings or the environment — see
309
+ [Connecting a model](#connecting-a-model). `ucx llm status` says which
310
+ providers answered.
311
+ * **A key in `.env` is ignored.** `ucx` reads the environment, not `.env`; load
312
+ the file into your shell first.
313
+ * **`ucx: command not found` after the installer.** It is not on your PATH yet;
314
+ add the `export PATH=…` line the installer printed to `~/.zshrc` (or
315
+ `~/.bashrc`), or run it as `~/.local/bin/ucx` until then — see [Install](#install).
316
+
317
+ ## For developers
180
318
 
181
- ## What UClone-X is
319
+ ### The runtime
182
320
 
183
321
  An agent runtime built around a non-blocking reactive event loop rather than a
184
322
  blocking request/response cycle. Agents yield when idle and wake on tool
@@ -199,7 +337,7 @@ external broker.
199
337
  reasons against instead of inventing structure per prompt.
200
338
  * **OpenTelemetry native** — traces, metrics and OTLP export built in.
201
339
 
202
- ## Implementation status
340
+ ### Implementation status
203
341
 
204
342
  UClone-X is pre-1.0 and under active development. Read this section before
205
343
  depending on it.
@@ -209,60 +347,38 @@ depending on it.
209
347
  | Event bus, agent state machine, sessions | Implemented |
210
348
  | Tool runtime, MCP client, built-in tools | Implemented |
211
349
  | LLM connectors (Gemini, Claude, OpenAI, Ollama, vLLM) | Implemented |
350
+ | Dashboard: conversations, clones, memory, settings | Implemented |
351
+ | Local image generation | Implemented |
212
352
  | Sandbox isolation modes | Implemented (host and workspace); container and WASM partial |
213
353
  | Ontology engine, skills, code intelligence | Implemented, evolving |
214
- | Developer dashboard | Implemented |
215
354
  | A2A protocol | **Specified, not implemented.** No conformance is claimed |
216
355
 
217
- ## Something went wrong?
218
-
219
- `ucx` keeps a record of what failed, on your machine, and only if you allow it:
220
-
221
- ```bash
222
- ucx report --enable # start recording failures locally
223
- ucx report # show what has been recorded
224
- ucx report --open # open a pre-filled bug report in your browser
225
- ```
226
-
227
- **Nothing is uploaded on its own.** There is no telemetry server and no account
228
- to sign into. `ucx report` prints the exact text that would be sent; `--open`
229
- fills in a GitHub issue form that you still have to submit yourself. If you have
230
- the GitHub CLI, `ucx report --submit` files it through your own `gh` login.
231
-
232
- What gets recorded: the error type, the code path it failed on, your UClone-X,
233
- Python and OS versions, and the error message. Your prompts and the contents of
234
- your files are never included, and paths are reduced — code paths to the file
235
- name, home directories to `~`.
236
-
237
- Masking is pattern-based, like every credential scrubber: it recognises the
238
- shapes that occur in practice — `sk-…`, `ghp_…`, home directories on Linux,
239
- macOS and Windows — and cannot promise to catch a token shape or a path layout
240
- nobody has seen. That is why `ucx report` shows you the text before anything is
241
- sent, and why the text is the last word on what leaves your machine.
242
-
243
- Turn it off with `ucx report --disable` and delete what was recorded with
244
- `ucx report --clear`.
356
+ ### Documentation
245
357
 
246
- ## Documentation
358
+ The documents below are the design and specification of the runtime; they are
359
+ written for contributors rather than as a user manual.
247
360
 
248
- * [Architecture overview](docs/architecture-overview.md)
249
- * [Event-driven agent core](docs/event-driven-agent-core.md)
250
- * [Core principles P0–P9](docs/principles/core-principles.md) — the normative
361
+ * [Documentation index](https://github.com/UClone-AI/uclone-x/blob/main/docs/README.md)
362
+ * [Module structure](https://github.com/UClone-AI/uclone-x/blob/main/docs/module-structure.md) — the packages as built, their layers
363
+ and dependency edges
364
+ * [Architecture overview](https://github.com/UClone-AI/uclone-x/blob/main/docs/architecture-overview.md)
365
+ * [Event-driven agent core](https://github.com/UClone-AI/uclone-x/blob/main/docs/event-driven-agent-core.md)
366
+ * [Core principles P0–P9](https://github.com/UClone-AI/uclone-x/blob/main/docs/principles/core-principles.md) — the normative
251
367
  rules every part of the runtime is built against
252
- * [Product requirements](docs/PRD.md)
253
- * [CLI specification](docs/cli-specification.md)
254
- * [LLM-agnostic interface](docs/llm-agnostic-interface.md)
255
- * [Dynamic persona and sub-agent interface](docs/dynamic-persona-interface.md)
256
- * [Local collaboration engine](docs/local-collaboration-engine.md)
257
- * [Sandbox execution](docs/sandbox-execution-architecture.md)
258
- * [Ontology architecture](docs/agent-ontology-architecture.md)
259
- * [Skill system](docs/skill-system-architecture.md)
260
- * [Code intelligence (AST, LSP, SCIP)](docs/code-intelligence-lsp-scip.md)
261
- * [Telemetry](docs/telemetry-opentelemetry.md)
262
- * [A2A protocol specification](docs/a2a-protocol-spec.md)
263
- * [Security threat model](docs/security-threat-model.md)
264
-
265
- ## Development
368
+ * [Product requirements](https://github.com/UClone-AI/uclone-x/blob/main/docs/PRD.md)
369
+ * [CLI specification](https://github.com/UClone-AI/uclone-x/blob/main/docs/cli-specification.md)
370
+ * [LLM-agnostic interface](https://github.com/UClone-AI/uclone-x/blob/main/docs/llm-agnostic-interface.md)
371
+ * [Dynamic persona and sub-agent interface](https://github.com/UClone-AI/uclone-x/blob/main/docs/dynamic-persona-interface.md)
372
+ * [Local collaboration engine](https://github.com/UClone-AI/uclone-x/blob/main/docs/local-collaboration-engine.md)
373
+ * [Sandbox execution](https://github.com/UClone-AI/uclone-x/blob/main/docs/sandbox-execution-architecture.md)
374
+ * [Ontology architecture](https://github.com/UClone-AI/uclone-x/blob/main/docs/agent-ontology-architecture.md)
375
+ * [Skill system](https://github.com/UClone-AI/uclone-x/blob/main/docs/skill-system-architecture.md)
376
+ * [Code intelligence (AST, LSP, SCIP)](https://github.com/UClone-AI/uclone-x/blob/main/docs/code-intelligence-lsp-scip.md)
377
+ * [Telemetry](https://github.com/UClone-AI/uclone-x/blob/main/docs/telemetry-opentelemetry.md)
378
+ * [A2A protocol specification](https://github.com/UClone-AI/uclone-x/blob/main/docs/a2a-protocol-spec.md)
379
+ * [Security threat model](https://github.com/UClone-AI/uclone-x/blob/main/docs/security-threat-model.md)
380
+
381
+ ### Working on UClone-X
266
382
 
267
383
  An installed build is for *using* the agent. To change it, work from a checkout:
268
384
  the development commands — `setup`, `test`, `dev` — exist only there, because
@@ -281,19 +397,19 @@ npm ci --prefix frontend # the gate runs the frontend's vitest suite
281
397
  strict mode, the test suite at or above 70% branch coverage, and a passing
282
398
  frontend vitest suite. A change that does not pass it is not ready.
283
399
 
284
- See [CONTRIBUTING.md](CONTRIBUTING.md) for how patches reach this repository,
285
- and [docs/local-development-guide.md](docs/local-development-guide.md) for the
400
+ See [CONTRIBUTING.md](https://github.com/UClone-AI/uclone-x/blob/main/CONTRIBUTING.md) for how patches reach this repository,
401
+ and the [local development guide](https://github.com/UClone-AI/uclone-x/blob/main/docs/local-development-guide.md) for the
286
402
  longer setup walkthrough.
287
403
 
288
404
  ## About this repository
289
405
 
290
- This repository is the UClone-X runtime and its documentation. It is published
291
- from a private development repository, in periodic snapshots rather than as a
292
- mirror of that repository's history. The evaluation suites and multi-agent
293
- build tooling used to develop it are not part of the published subset; the
294
- runtime detects their absence and degrades cleanly, so `ucx eval` reports that
295
- no evaluation backend is installed rather than failing to start.
406
+ This repository is the UClone-X runtime, its dashboard and its documentation. It
407
+ is published from a private development repository, in periodic snapshots rather
408
+ than as a mirror of that repository's history. The evaluation suites and
409
+ multi-agent build tooling used to develop it are not part of the published
410
+ subset; the runtime detects their absence and degrades cleanly, so `ucx eval`
411
+ reports that no evaluation backend is installed rather than failing to start.
296
412
 
297
413
  ## License
298
414
 
299
- Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
415
+ Apache 2.0 — see [LICENSE](https://github.com/UClone-AI/uclone-x/blob/main/LICENSE) and [NOTICE](https://github.com/UClone-AI/uclone-x/blob/main/NOTICE).