superqode 0.1.7__tar.gz → 0.1.8__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 (305) hide show
  1. {superqode-0.1.7/src/superqode.egg-info → superqode-0.1.8}/PKG-INFO +2 -2
  2. {superqode-0.1.7 → superqode-0.1.8}/README.md +1 -1
  3. {superqode-0.1.7 → superqode-0.1.8}/pyproject.toml +1 -1
  4. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/__init__.py +1 -1
  5. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp_discovery.py +1 -1
  6. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/molt.bot.toml +13 -13
  7. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app_main.py +287 -76
  8. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/data/superqode-template.yaml +65 -65
  9. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/litellm_gateway.py +9 -9
  10. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/__init__.py +2 -0
  11. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/hub.py +53 -0
  12. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/registry.py +11 -0
  13. {superqode-0.1.7 → superqode-0.1.8/src/superqode.egg-info}/PKG-INFO +2 -2
  14. {superqode-0.1.7 → superqode-0.1.8}/LICENSE +0 -0
  15. {superqode-0.1.7 → superqode-0.1.8}/setup.cfg +0 -0
  16. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/__init__.py +0 -0
  17. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/client.py +0 -0
  18. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/permission_screen.py +0 -0
  19. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/types.py +0 -0
  20. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/__init__.py +0 -0
  21. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/edit_strategies.py +0 -0
  22. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/loop.py +0 -0
  23. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/qe_report_templates.py +0 -0
  24. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/system_prompts.py +0 -0
  25. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent_output.py +0 -0
  26. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent_stream.py +0 -0
  27. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/__init__.py +0 -0
  28. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/acp_registry.py +0 -0
  29. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/client.py +0 -0
  30. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/augmentcode.com.toml +0 -0
  31. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/cagent.dev.toml +0 -0
  32. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/claude.com.toml +0 -0
  33. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
  34. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/codex.openai.com.toml +0 -0
  35. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/fastagent.ai.toml +0 -0
  36. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/geminicli.com.toml +0 -0
  37. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
  38. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
  39. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
  40. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
  41. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/opencode.ai.toml +0 -0
  42. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/stakpak.dev.toml +0 -0
  43. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/vtcode.dev.toml +0 -0
  44. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/discovery.py +0 -0
  45. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/messaging.py +0 -0
  46. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/persona.py +0 -0
  47. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/registry.py +0 -0
  48. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/schema.py +0 -0
  49. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/unified.py +0 -0
  50. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/__init__.py +0 -0
  51. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/constants.py +0 -0
  52. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/css.py +0 -0
  53. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/models.py +0 -0
  54. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/suggester.py +0 -0
  55. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/widgets.py +0 -0
  56. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app_enhanced.py +0 -0
  57. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/approval.py +0 -0
  58. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/atomic.py +0 -0
  59. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/__init__.py +0 -0
  60. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/acp.py +0 -0
  61. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/agents.py +0 -0
  62. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/auth.py +0 -0
  63. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/config.py +0 -0
  64. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/init.py +0 -0
  65. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/providers.py +0 -0
  66. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/qe.py +0 -0
  67. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/roles.py +0 -0
  68. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/serve.py +0 -0
  69. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/suggestions.py +0 -0
  70. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/superqe.py +0 -0
  71. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/__init__.py +0 -0
  72. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/loader.py +0 -0
  73. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/schema.py +0 -0
  74. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/core/__init__.py +0 -0
  75. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/core/roles.py +0 -0
  76. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/danger.py +0 -0
  77. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/design_system.py +0 -0
  78. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/__init__.py +0 -0
  79. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/base.py +0 -0
  80. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/model.py +0 -0
  81. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/provider.py +0 -0
  82. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/diff_view.py +0 -0
  83. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/enterprise.py +0 -0
  84. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/__init__.py +0 -0
  85. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/adapters.py +0 -0
  86. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/behaviors.py +0 -0
  87. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/engine.py +0 -0
  88. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/scenarios.py +0 -0
  89. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/__init__.py +0 -0
  90. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/linter.py +0 -0
  91. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/modes.py +0 -0
  92. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/resolver.py +0 -0
  93. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/runner.py +0 -0
  94. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/file_explorer.py +0 -0
  95. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/file_viewer.py +0 -0
  96. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/flash.py +0 -0
  97. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/__init__.py +0 -0
  98. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/config.py +0 -0
  99. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/prompts.py +0 -0
  100. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/__init__.py +0 -0
  101. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/accelerator.py +0 -0
  102. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/config.py +0 -0
  103. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/validator.py +0 -0
  104. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/history.py +0 -0
  105. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/integrations/superopt_runner.py +0 -0
  106. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/__init__.py +0 -0
  107. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/adapters.py +0 -0
  108. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/formatter.py +0 -0
  109. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/integration.py +0 -0
  110. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/sinks.py +0 -0
  111. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/unified_log.py +0 -0
  112. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/lsp/__init__.py +0 -0
  113. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/lsp/client.py +0 -0
  114. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/main.py +0 -0
  115. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/__init__.py +0 -0
  116. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/auth_storage.py +0 -0
  117. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/client.py +0 -0
  118. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/config.py +0 -0
  119. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/integration.py +0 -0
  120. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/oauth.py +0 -0
  121. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/oauth_callback.py +0 -0
  122. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/types.py +0 -0
  123. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/__init__.py +0 -0
  124. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/feedback.py +0 -0
  125. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/store.py +0 -0
  126. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/notifications.py +0 -0
  127. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/optimization/__init__.py +0 -0
  128. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/optimization/config.py +0 -0
  129. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/permissions/__init__.py +0 -0
  130. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/permissions/rules.py +0 -0
  131. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/plan.py +0 -0
  132. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/__init__.py +0 -0
  133. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/__init__.py +0 -0
  134. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/base.py +0 -0
  135. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
  136. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/health.py +0 -0
  137. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/downloader.py +0 -0
  138. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/endpoints.py +0 -0
  139. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/inference.py +0 -0
  140. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
  141. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/__init__.py +0 -0
  142. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/base.py +0 -0
  143. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/discovery.py +0 -0
  144. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/lmstudio.py +0 -0
  145. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/mlx.py +0 -0
  146. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/ollama.py +0 -0
  147. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/sglang.py +0 -0
  148. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/tgi.py +0 -0
  149. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/tool_support.py +0 -0
  150. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/vllm.py +0 -0
  151. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/manager.py +0 -0
  152. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/models.py +0 -0
  153. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/models_dev.py +0 -0
  154. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/__init__.py +0 -0
  155. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
  156. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/messages.py +0 -0
  157. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/tools.py +0 -0
  158. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
  159. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/schema/models.py +0 -0
  160. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
  161. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
  162. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
  163. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
  164. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
  165. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
  166. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
  167. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/usage.py +0 -0
  168. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/pure_mode.py +0 -0
  169. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/__init__.py +0 -0
  170. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/dashboard.py +0 -0
  171. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/generator.py +0 -0
  172. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/templates.py +0 -0
  173. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/__init__.py +0 -0
  174. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/sandbox.py +0 -0
  175. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/warnings.py +0 -0
  176. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/__init__.py +0 -0
  177. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/lsp_server.py +0 -0
  178. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/web.py +0 -0
  179. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/__init__.py +0 -0
  180. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/persistence.py +0 -0
  181. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/sharing.py +0 -0
  182. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session.py +0 -0
  183. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/sidebar.py +0 -0
  184. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/stream_view.py +0 -0
  185. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/styles/__init__.py +0 -0
  186. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/__init__.py +0 -0
  187. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/acp_runner.py +0 -0
  188. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/__init__.py +0 -0
  189. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/evaluator.py +0 -0
  190. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/loader.py +0 -0
  191. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/schema.py +0 -0
  192. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/events.py +0 -0
  193. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/__init__.py +0 -0
  194. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/base.py +0 -0
  195. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/e2e.py +0 -0
  196. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/executor.py +0 -0
  197. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/javascript.py +0 -0
  198. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/python.py +0 -0
  199. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/registry.py +0 -0
  200. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/__init__.py +0 -0
  201. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/core_tools.py +0 -0
  202. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/registry.py +0 -0
  203. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/testing_tools.py +0 -0
  204. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/noise.py +0 -0
  205. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/orchestrator.py +0 -0
  206. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/roles.py +0 -0
  207. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/session.py +0 -0
  208. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/__init__.py +0 -0
  209. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/base.py +0 -0
  210. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/core_skills.py +0 -0
  211. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/registry.py +0 -0
  212. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/verifier.py +0 -0
  213. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe_cli.py +0 -0
  214. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tool_call.py +0 -0
  215. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/__init__.py +0 -0
  216. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/agent_tools.py +0 -0
  217. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/base.py +0 -0
  218. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/batch_tool.py +0 -0
  219. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/diagnostics.py +0 -0
  220. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/edit_tools.py +0 -0
  221. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/enhanced_base.py +0 -0
  222. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/file_tools.py +0 -0
  223. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/file_tracking.py +0 -0
  224. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/lsp_tools.py +0 -0
  225. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/network_tools.py +0 -0
  226. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/permissions.py +0 -0
  227. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/question_tool.py +0 -0
  228. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/search_tools.py +0 -0
  229. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/shell_tools.py +0 -0
  230. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/todo_tools.py +0 -0
  231. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/validation.py +0 -0
  232. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/web_tools.py +0 -0
  233. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui.py +0 -0
  234. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_integration.py +0 -0
  235. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/__init__.py +0 -0
  236. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
  237. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/progress.py +0 -0
  238. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
  239. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/undo_manager.py +0 -0
  240. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/__init__.py +0 -0
  241. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/error_handling.py +0 -0
  242. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/fuzzy.py +0 -0
  243. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/__init__.py +0 -0
  244. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_collab.py +0 -0
  245. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_store.py +0 -0
  246. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_switcher.py +0 -0
  247. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/animation_manager.py +0 -0
  248. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/code_context.py +0 -0
  249. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/command_palette.py +0 -0
  250. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/connection_status.py +0 -0
  251. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/conversation_history.py +0 -0
  252. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/diff_indicator.py +0 -0
  253. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/enhanced_status_bar.py +0 -0
  254. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/enhanced_toast.py +0 -0
  255. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/file_browser.py +0 -0
  256. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/file_reference.py +0 -0
  257. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/issue_timeline.py +0 -0
  258. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/leader_key.py +0 -0
  259. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/mode_switcher.py +0 -0
  260. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/model_picker.py +0 -0
  261. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/permission_preview.py +0 -0
  262. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/prompt.py +0 -0
  263. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/provider_connect.py +0 -0
  264. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/pty_shell.py +0 -0
  265. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/qe_dashboard.py +0 -0
  266. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/resizable_sidebar.py +0 -0
  267. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/response_changes.py +0 -0
  268. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/response_display.py +0 -0
  269. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/rich_tool_display.py +0 -0
  270. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/sidebar_panels.py +0 -0
  271. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/slash_complete.py +0 -0
  272. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/split_view.py +0 -0
  273. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/status_bar.py +0 -0
  274. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/superqode_display.py +0 -0
  275. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/thinking_display.py +0 -0
  276. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/throbber.py +0 -0
  277. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/toast.py +0 -0
  278. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/unified_output.py +0 -0
  279. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/__init__.py +0 -0
  280. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/artifacts.py +0 -0
  281. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/coordinator.py +0 -0
  282. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/diff_tracker.py +0 -0
  283. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/git_guard.py +0 -0
  284. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/git_snapshot.py +0 -0
  285. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/manager.py +0 -0
  286. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/snapshot.py +0 -0
  287. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/watcher.py +0 -0
  288. {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/worktree.py +0 -0
  289. {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/SOURCES.txt +0 -0
  290. {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/dependency_links.txt +0 -0
  291. {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/entry_points.txt +0 -0
  292. {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/requires.txt +0 -0
  293. {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/top_level.txt +0 -0
  294. {superqode-0.1.7 → superqode-0.1.8}/tests/test_acp_client.py +0 -0
  295. {superqode-0.1.7 → superqode-0.1.8}/tests/test_cli_commands.py +0 -0
  296. {superqode-0.1.7 → superqode-0.1.8}/tests/test_linter_runner.py +0 -0
  297. {superqode-0.1.7 → superqode-0.1.8}/tests/test_login_api.py +0 -0
  298. {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp.py +0 -0
  299. {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp_integration.py +0 -0
  300. {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp_live.py +0 -0
  301. {superqode-0.1.7 → superqode-0.1.8}/tests/test_orchestrator.py +0 -0
  302. {superqode-0.1.7 → superqode-0.1.8}/tests/test_oss_integration.py +0 -0
  303. {superqode-0.1.7 → superqode-0.1.8}/tests/test_simple_login.py +0 -0
  304. {superqode-0.1.7 → superqode-0.1.8}/tests/test_tools.py +0 -0
  305. {superqode-0.1.7 → superqode-0.1.8}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superqode
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: SuperQode: Super Quality Engineering for Agentic Coding Teams
5
5
  Author-email: Shashi Jagtap <info@super-agentic.ai>
6
6
  Maintainer-email: Shashi Jagtap <info@super-agentic.ai>
@@ -113,7 +113,7 @@ Dynamic: license-file
113
113
 
114
114
  **SuperQode** is the agentic coding harness designed to drive the SuperQE process. It delivers a Superior and Quality Optimized Developer Experience as a TUI for interactive development, debugging, and exploratory QE. SuperQode can also be used as a general development harness beyond QE.
115
115
 
116
- **Note (Enterprise):** Enterprise adds powerful automation, deep evaluation testing, and enterprise integrations (Moltbot first; more bot integrations coming).
116
+ **Note (Enterprise):** Enterprise adds powerful automation, deep evaluation testing, and enterprise integrations (OpenClaw first; more bot integrations coming).
117
117
 
118
118
  ## Demo Video
119
119
 
@@ -43,7 +43,7 @@
43
43
 
44
44
  **SuperQode** is the agentic coding harness designed to drive the SuperQE process. It delivers a Superior and Quality Optimized Developer Experience as a TUI for interactive development, debugging, and exploratory QE. SuperQode can also be used as a general development harness beyond QE.
45
45
 
46
- **Note (Enterprise):** Enterprise adds powerful automation, deep evaluation testing, and enterprise integrations (Moltbot first; more bot integrations coming).
46
+ **Note (Enterprise):** Enterprise adds powerful automation, deep evaluation testing, and enterprise integrations (OpenClaw first; more bot integrations coming).
47
47
 
48
48
  ## Demo Video
49
49
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superqode"
3
- version = "0.1.7"
3
+ version = "0.1.8"
4
4
  description = "SuperQode: Super Quality Engineering for Agentic Coding Teams"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -30,4 +30,4 @@ __all__ = [
30
30
  "sidebar",
31
31
  ]
32
32
 
33
- __version__ = "0.1.6"
33
+ __version__ = "0.1.8"
@@ -368,7 +368,7 @@ KNOWN_AGENTS: List[Dict[str, Any]] = [
368
368
  "command": ["fast-agent-acp", "-x"],
369
369
  "alt_commands": [
370
370
  ["fast-agent-acp"],
371
- ["fast-agent", "serve","--transport","acp"],
371
+ ["fast-agent", "serve", "--transport", "acp"],
372
372
  ],
373
373
  "icon": "🚀",
374
374
  "color": "#14b8a6",
@@ -1,28 +1,28 @@
1
- # Moltbot
2
- # https://www.molt.bot/
1
+ # OpenClaw
2
+ # https://openclaw.ai/
3
3
 
4
4
  identity = "molt.bot"
5
- name = "Moltbot"
5
+ name = "OpenClaw"
6
6
  short_name = "moltbot"
7
- url = "https://www.molt.bot/"
7
+ url = "https://openclaw.ai/"
8
8
  protocol = "acp"
9
- author_name = "Moltbot"
10
- author_url = "https://www.molt.bot/"
11
- publisher_name = "Moltbot"
9
+ author_name = "OpenClaw"
10
+ author_url = "https://openclaw.ai/"
11
+ publisher_name = "OpenClaw"
12
12
  publisher_url = "https://github.com/moltbot/moltbot"
13
13
  type = "coding"
14
- description = "Moltbot ACP bridge backed by the Moltbot Gateway (self-hosted)."
14
+ description = "OpenClaw ACP bridge backed by the OpenClaw Gateway (self-hosted)."
15
15
  tags = ["enterprise", "integration", "automation", "gateway"]
16
16
  run_command."*" = "moltbot acp --url ws://127.0.0.1:18789"
17
17
 
18
18
  help = '''
19
- # Moltbot
19
+ # OpenClaw
20
20
 
21
- Moltbot provides an ACP bridge that connects SuperQode to a running Moltbot Gateway.
21
+ OpenClaw provides an ACP bridge that connects SuperQode to a running OpenClaw Gateway.
22
22
 
23
23
  ## Requirements
24
24
 
25
- - Moltbot Gateway must be running and reachable
25
+ - OpenClaw Gateway must be running and reachable
26
26
  - Node.js 22+ runtime
27
27
 
28
28
  ## Connect
@@ -40,10 +40,10 @@ corresponding environment variables.
40
40
 
41
41
  ---
42
42
 
43
- **Website**: https://www.molt.bot/
43
+ **Website**: https://openclaw.ai/
44
44
  **GitHub**: https://github.com/moltbot/moltbot
45
45
  '''
46
46
 
47
47
  [actions."*".install]
48
48
  command = "npm install -g moltbot@latest"
49
- description = "Install Moltbot"
49
+ description = "Install OpenClaw"
@@ -244,8 +244,21 @@ class SelectionAwareInput(Input):
244
244
  """Intercept key events for selection navigation and number selection."""
245
245
  app = self.app
246
246
 
247
- # Handle number keys 1-9 during selection modes (except model selection)
247
+ # Handle number keys during selection modes
248
248
  if event.key in ("1", "2", "3", "4", "5", "6", "7", "8", "9"):
249
+ # For BYOK/local provider/model selection, buffer digits for multi-digit entry
250
+ if (
251
+ getattr(app, "_awaiting_byok_provider", False)
252
+ or getattr(app, "_awaiting_local_provider", False)
253
+ or getattr(app, "_awaiting_byok_model", False)
254
+ or getattr(app, "_awaiting_local_model", False)
255
+ ):
256
+ event.stop()
257
+ event.prevent_default()
258
+ if hasattr(app, "_queue_selection_digit"):
259
+ app._queue_selection_digit(event.key)
260
+ return
261
+
249
262
  if self._is_in_selection_mode_for_number_keys(app):
250
263
  # Prevent the number from being typed into input
251
264
  event.stop()
@@ -1761,7 +1774,8 @@ class SuperQodeApp(App):
1761
1774
  if getattr(self, "_awaiting_local_model", False):
1762
1775
  self._awaiting_local_model = False
1763
1776
  log = self.query_one("#log", ConversationLog)
1764
- log.add_info("Selection cancelled. Use :connect to try again.")
1777
+ # Return to local provider list for a clear "cancel" behavior
1778
+ self._show_local_provider_picker(log)
1765
1779
  return
1766
1780
  if getattr(self, "_awaiting_local_provider", False):
1767
1781
  self._awaiting_local_provider = False
@@ -1968,6 +1982,25 @@ class SuperQodeApp(App):
1968
1982
  - OpenCode model selection
1969
1983
  """
1970
1984
  log = self.query_one("#log", ConversationLog)
1985
+ # While awaiting typed selection, inject digits into prompt instead of auto-selecting
1986
+ if (
1987
+ getattr(self, "_awaiting_byok_model", False)
1988
+ or getattr(self, "_awaiting_local_model", False)
1989
+ or getattr(self, "_awaiting_byok_provider", False)
1990
+ or getattr(self, "_awaiting_local_provider", False)
1991
+ ):
1992
+ try:
1993
+ prompt_input = self.query_one("#prompt-input", Input)
1994
+ if not prompt_input.has_focus:
1995
+ prompt_input.focus()
1996
+ cursor = prompt_input.cursor_position
1997
+ value = prompt_input.value
1998
+ digit = str(num)
1999
+ prompt_input.value = f"{value[:cursor]}{digit}{value[cursor:]}"
2000
+ prompt_input.cursor_position = cursor + 1
2001
+ except Exception:
2002
+ pass
2003
+ return True
1971
2004
 
1972
2005
  # 1. Handle connection type selection first
1973
2006
  if getattr(self, "_awaiting_connect_type", False):
@@ -2050,6 +2083,66 @@ class SuperQodeApp(App):
2050
2083
 
2051
2084
  return False
2052
2085
 
2086
+ def _queue_selection_digit(self, digit: str) -> None:
2087
+ """Queue a digit for multi-digit selection in provider/model pickers."""
2088
+ buf = getattr(self, "_selection_digit_buffer", "")
2089
+ buf += digit
2090
+ self._selection_digit_buffer = buf
2091
+
2092
+ # Mirror buffer in prompt input for visibility
2093
+ try:
2094
+ prompt_input = self.query_one("#prompt-input", Input)
2095
+ prompt_input.value = buf
2096
+ prompt_input.cursor_position = len(buf)
2097
+ except Exception:
2098
+ pass
2099
+
2100
+ # Reset timer
2101
+ timer = getattr(self, "_selection_digit_timer", None)
2102
+ try:
2103
+ if timer:
2104
+ timer.stop()
2105
+ except Exception:
2106
+ pass
2107
+ self._selection_digit_timer = self.set_timer(0.35, self._apply_selection_buffer)
2108
+
2109
+ def _apply_selection_buffer(self) -> None:
2110
+ """Apply buffered numeric selection to the current picker."""
2111
+ buf = getattr(self, "_selection_digit_buffer", "")
2112
+ if not buf:
2113
+ return
2114
+
2115
+ # Clear buffer and prompt
2116
+ self._selection_digit_buffer = ""
2117
+ self._selection_digit_timer = None
2118
+ try:
2119
+ prompt_input = self.query_one("#prompt-input", Input)
2120
+ prompt_input.value = ""
2121
+ prompt_input.cursor_position = 0
2122
+ except Exception:
2123
+ pass
2124
+
2125
+ log = self.query_one("#log", ConversationLog)
2126
+
2127
+ if getattr(self, "_awaiting_byok_provider", False):
2128
+ self._handle_byok_provider_selection(buf, log)
2129
+ return
2130
+ if getattr(self, "_awaiting_local_provider", False):
2131
+ self._handle_local_provider_selection(buf, log)
2132
+ return
2133
+ if getattr(self, "_awaiting_byok_model", False):
2134
+ self._handle_byok_model_selection(buf, log)
2135
+ return
2136
+ if getattr(self, "_awaiting_local_model", False):
2137
+ self._handle_local_model_selection(buf, log)
2138
+ return
2139
+
2140
+ # Fallback to universal selection for other modes
2141
+ try:
2142
+ self._select_by_number_universal(int(buf))
2143
+ except Exception:
2144
+ pass
2145
+
2053
2146
  def action_select_model_1(self):
2054
2147
  """Select item 1 in current selection mode."""
2055
2148
  self._select_by_number_universal(1)
@@ -2893,6 +2986,15 @@ class SuperQodeApp(App):
2893
2986
  return
2894
2987
 
2895
2988
  text = event.value.strip()
2989
+ # If a selection digit buffer is active, clear its timer to avoid double-select
2990
+ if hasattr(self, "_selection_digit_timer") and self._selection_digit_timer:
2991
+ try:
2992
+ self._selection_digit_timer.stop()
2993
+ except Exception:
2994
+ pass
2995
+ self._selection_digit_timer = None
2996
+ if hasattr(self, "_selection_digit_buffer"):
2997
+ self._selection_digit_buffer = ""
2896
2998
  log = self.query_one("#log", ConversationLog)
2897
2999
 
2898
3000
  # Handle Enter key (empty input) for selections
@@ -11635,6 +11737,19 @@ team:
11635
11737
  local providers are properly identified. Local providers are
11636
11738
  already handled in _connect_byok_mode() via ProviderCategory.LOCAL.
11637
11739
  """
11740
+ # HuggingFace cached models need a local runtime (e.g., MLX/TGI), not HF Inference API
11741
+ if provider == "huggingface-local":
11742
+ model_lower = model.lower()
11743
+ if "mlx" in model_lower or model_lower.startswith("mlx-community/"):
11744
+ log.add_info("Routing cached MLX model to MLX local provider.")
11745
+ provider = "mlx"
11746
+ else:
11747
+ log.add_error(
11748
+ "HuggingFace cached models require a local runtime (mlx/tgi/vllm/sglang)."
11749
+ )
11750
+ log.add_info("Use: :connect local <provider> <model>")
11751
+ return
11752
+
11638
11753
  # Local providers use the same connection mechanism as BYOK
11639
11754
  # but are identified by ProviderCategory.LOCAL
11640
11755
  self._connect_byok_mode(provider, model, log)
@@ -11651,6 +11766,10 @@ team:
11651
11766
  # Clear ALL local-related state to prevent any auto-selection
11652
11767
  self._awaiting_local_provider = True
11653
11768
  self._awaiting_local_model = False # MUST be False - we're selecting provider, not model
11769
+ # Clear any BYOK selection state so numeric input routes to local picker
11770
+ self._awaiting_byok_provider = False
11771
+ self._awaiting_byok_model = False
11772
+ self._just_showed_byok_picker = False
11654
11773
 
11655
11774
  # Delete local selection state (but keep _local_provider_list - we'll set it later)
11656
11775
  for attr in ["_local_selected_provider", "_local_model_list", "_local_cached_models"]:
@@ -11679,8 +11798,8 @@ team:
11679
11798
  }
11680
11799
 
11681
11800
  # Add HuggingFace to local providers list (it's in MODEL_HOSTS category but available via :connect local)
11682
- if "huggingface" in PROVIDERS:
11683
- local_providers["huggingface"] = PROVIDERS["huggingface"]
11801
+ if "huggingface-local" in PROVIDERS:
11802
+ local_providers["huggingface-local"] = PROVIDERS["huggingface-local"]
11684
11803
 
11685
11804
  t = Text()
11686
11805
  t.append(f"\n", style="")
@@ -12665,44 +12784,88 @@ team:
12665
12784
  t.append(f" Available models:\n", style=THEME["muted"])
12666
12785
  model_list = []
12667
12786
 
12668
- # Sort example models to show latest first
12669
- def sort_example_models(model_id: str) -> int:
12670
- """Sort example models - latest first."""
12671
- model_lower = model_id.lower()
12672
- # Latest models get higher priority (lower number)
12673
- if any(x in model_lower for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]):
12674
- return 0
12675
- elif any(x in model_lower for x in ["4.5", "4-plus", "4-air", "2.5"]):
12676
- return 1
12677
- else:
12678
- return 2
12787
+ # Special case: Hugging Face BYOK should show recommended models
12788
+ if provider_id == "huggingface":
12789
+ try:
12790
+ from superqode.providers.huggingface import RECOMMENDED_MODELS
12791
+
12792
+ all_models = []
12793
+ for category_models in RECOMMENDED_MODELS.values():
12794
+ all_models.extend(category_models)
12795
+
12796
+ seen = set()
12797
+ unique_models = []
12798
+ for m in all_models:
12799
+ if m not in seen:
12800
+ seen.add(m)
12801
+ unique_models.append(m)
12802
+
12803
+ if unique_models:
12804
+ t.append(f" Recommended models:\n", style=THEME["muted"])
12805
+ for idx, model in enumerate(unique_models[:30], 1):
12806
+ is_highlighted = (idx - 1) == getattr(
12807
+ self, "_byok_highlighted_model_index", 0
12808
+ )
12809
+ if is_highlighted:
12810
+ t.append(f" ▶ ", style=f"bold {THEME['success']}")
12811
+ t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
12812
+ t.append(f"{model}", style=f"bold {THEME['success']}")
12813
+ t.append(f" ← SELECTED\n", style=f"bold {THEME['success']}")
12814
+ else:
12815
+ t.append(f" [{idx:2}] ", style=THEME["dim"])
12816
+ t.append(f"{model}\n", style=THEME["text"])
12817
+ model_list.append(model)
12818
+ except Exception:
12819
+ pass
12679
12820
 
12680
- sorted_models = sorted(provider_def.example_models, key=sort_example_models)
12821
+ if not model_list:
12822
+ # Sort example models to show latest first
12823
+ def sort_example_models(model_id: str) -> int:
12824
+ """Sort example models - latest first."""
12825
+ model_lower = model_id.lower()
12826
+ # Latest models get higher priority (lower number)
12827
+ if any(
12828
+ x in model_lower
12829
+ for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]
12830
+ ):
12831
+ return 0
12832
+ elif any(x in model_lower for x in ["4.5", "4-plus", "4-air", "2.5"]):
12833
+ return 1
12834
+ else:
12835
+ return 2
12681
12836
 
12682
- for idx, model in enumerate(sorted_models[:15], 1): # Show more models
12683
- # Highlight current selection
12684
- is_highlighted = (idx - 1) == getattr(self, "_byok_highlighted_model_index", 0)
12685
- if is_highlighted:
12686
- t.append(f" ▶ ", style=f"bold {THEME['success']}")
12687
- t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
12688
- # Highlight latest models
12689
- is_latest = any(
12690
- x in model.lower() for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]
12691
- )
12692
- name_style = (
12693
- f"bold {THEME['success']}" if is_latest else f"bold {THEME['success']}"
12694
- )
12695
- t.append(f"{model}", style=name_style)
12696
- t.append(f" ← SELECTED\n", style=f"bold {THEME['success']}")
12697
- else:
12698
- t.append(f" [{idx:2}] ", style=THEME["dim"])
12699
- # Highlight latest models
12700
- is_latest = any(
12701
- x in model.lower() for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]
12837
+ sorted_models = sorted(provider_def.example_models, key=sort_example_models)
12838
+
12839
+ for idx, model in enumerate(sorted_models[:15], 1): # Show more models
12840
+ # Highlight current selection
12841
+ is_highlighted = (idx - 1) == getattr(
12842
+ self, "_byok_highlighted_model_index", 0
12702
12843
  )
12703
- name_style = f"bold {THEME['success']}" if is_latest else THEME["text"]
12704
- t.append(f"{model}\n", style=name_style)
12705
- model_list.append(model)
12844
+ if is_highlighted:
12845
+ t.append(f"", style=f"bold {THEME['success']}")
12846
+ t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
12847
+ # Highlight latest models
12848
+ is_latest = any(
12849
+ x in model.lower()
12850
+ for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]
12851
+ )
12852
+ name_style = (
12853
+ f"bold {THEME['success']}"
12854
+ if is_latest
12855
+ else f"bold {THEME['success']}"
12856
+ )
12857
+ t.append(f"{model}", style=name_style)
12858
+ t.append(f" ← SELECTED\n", style=f"bold {THEME['success']}")
12859
+ else:
12860
+ t.append(f" [{idx:2}] ", style=THEME["dim"])
12861
+ # Highlight latest models
12862
+ is_latest = any(
12863
+ x in model.lower()
12864
+ for x in ["4.7", "5.2", "5.1", "3.2", "3.3", "k2", "6.5"]
12865
+ )
12866
+ name_style = f"bold {THEME['success']}" if is_latest else THEME["text"]
12867
+ t.append(f"{model}\n", style=name_style)
12868
+ model_list.append(model)
12706
12869
 
12707
12870
  t.append(f"\n 💡 Quick Connect:\n", style=THEME["muted"])
12708
12871
  t.append(f" Type number (1-{len(model_list)}) to select by number\n", style=THEME["dim"])
@@ -12936,6 +13099,12 @@ team:
12936
13099
  log.add_error(f"Unknown provider: {provider_id}")
12937
13100
  return
12938
13101
 
13102
+ # Ensure local model selection is active, and BYOK selection is inactive
13103
+ self._awaiting_local_provider = False
13104
+ self._awaiting_local_model = True
13105
+ self._awaiting_byok_provider = False
13106
+ self._awaiting_byok_model = False
13107
+
12939
13108
  # Show experimental warning for vLLM and SGLang
12940
13109
  if provider_id in ("vllm", "sglang"):
12941
13110
  t = Text()
@@ -12949,60 +13118,55 @@ team:
12949
13118
 
12950
13119
  log.add_info(f"Discovering models from {provider_def.name}...")
12951
13120
 
12952
- # Special handling for HuggingFace (uses cloud API, not local client)
12953
- if provider_id == "huggingface":
12954
- # Load recommended HuggingFace models
12955
- from superqode.providers.huggingface import RECOMMENDED_MODELS
13121
+ # Special handling for HuggingFace (show locally cached models)
13122
+ if provider_id == "huggingface-local":
13123
+ from superqode.providers.huggingface import discover_cached_models
12956
13124
 
12957
- # Combine all recommended models
12958
- all_models = []
12959
- for category_models in RECOMMENDED_MODELS.values():
12960
- all_models.extend(category_models)
12961
-
12962
- # Remove duplicates while preserving order
12963
- seen = set()
12964
- unique_models = []
12965
- for m in all_models:
12966
- if m not in seen:
12967
- seen.add(m)
12968
- unique_models.append(m)
13125
+ cached = discover_cached_models()
13126
+ cached_models = [m["id"] for m in cached]
12969
13127
 
12970
13128
  # Display models
12971
13129
  t = Text()
12972
13130
  t.append(f"\n ◈ ", style=f"bold {THEME['purple']}")
12973
13131
  t.append(f"{provider_def.name} Models\n", style=f"bold {THEME['text']}")
12974
- t.append(f" {len(unique_models)} recommended model(s)\n\n", style=THEME["dim"])
13132
+ t.append(
13133
+ f" {len(cached_models)} locally cached model(s)\n\n", style=THEME["dim"]
13134
+ )
12975
13135
 
12976
13136
  # Store model list for selection
12977
13137
  self._local_selected_provider = provider_id
12978
- self._local_model_list = unique_models
13138
+ self._local_model_list = cached_models
13139
+ self._local_cached_models = cached_models
12979
13140
  self._awaiting_local_model = True
12980
13141
  self._awaiting_local_provider = False
12981
13142
 
12982
13143
  highlighted_idx = getattr(self, "_local_highlighted_model_index", 0)
12983
13144
 
12984
- for idx, model_id in enumerate(unique_models, 1):
12985
- is_highlighted = (idx - 1) == highlighted_idx
13145
+ if cached_models:
13146
+ for idx, model_id in enumerate(cached_models, 1):
13147
+ is_highlighted = (idx - 1) == highlighted_idx
12986
13148
 
12987
- if is_highlighted:
12988
- t.append(f" ▶ ", style=f"bold {THEME['success']}")
12989
- t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
12990
- else:
12991
- t.append(f" [{idx:2}] ", style=THEME["dim"])
13149
+ if is_highlighted:
13150
+ t.append(f" ▶ ", style=f"bold {THEME['success']}")
13151
+ t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
13152
+ else:
13153
+ t.append(f" [{idx:2}] ", style=THEME["dim"])
12992
13154
 
12993
- name_style = (
12994
- f"bold {THEME['success']}" if is_highlighted else f"bold {THEME['text']}"
12995
- )
12996
- t.append(f"{model_id}", style=name_style)
12997
- if is_highlighted:
12998
- t.append(f" ← SELECTED", style=f"bold {THEME['success']}")
12999
- t.append(f"\n", style="")
13155
+ name_style = (
13156
+ f"bold {THEME['success']}" if is_highlighted else f"bold {THEME['text']}"
13157
+ )
13158
+ t.append(f"{model_id}", style=name_style)
13159
+ if is_highlighted:
13160
+ t.append(f" ← SELECTED", style=f"bold {THEME['success']}")
13161
+ t.append(f"\n", style="")
13162
+ else:
13163
+ t.append(f" ○ No local HuggingFace models found\n\n", style=THEME["muted"])
13000
13164
 
13001
- t.append(f"\n 💡 ", style=THEME["muted"])
13165
+ t.append(f" 💡 ", style=THEME["muted"])
13002
13166
  t.append(f"Select a model number or name\n", style=THEME["text"])
13003
13167
  t.append(f" Use ", style=THEME["muted"])
13004
13168
  t.append(f":hf search <query>", style=THEME["cyan"])
13005
- t.append(f" to find more models\n", style=THEME["muted"])
13169
+ t.append(f" to find and download models\n", style=THEME["muted"])
13006
13170
 
13007
13171
  log.write(t)
13008
13172
  return
@@ -13241,7 +13405,54 @@ team:
13241
13405
  models = getattr(self, "_local_cached_models", [])
13242
13406
  model_list = getattr(self, "_local_model_list", [])
13243
13407
 
13244
- if not provider_id or not models:
13408
+ if not provider_id:
13409
+ return
13410
+
13411
+ # HuggingFace cached models are stored as plain IDs
13412
+ if provider_id == "huggingface-local":
13413
+ if not model_list:
13414
+ return
13415
+ provider_def = PROVIDERS.get(provider_id)
13416
+ if not provider_def:
13417
+ return
13418
+
13419
+ t = Text()
13420
+ t.append(f"\n ◈ ", style=f"bold {THEME['purple']}")
13421
+ t.append(f"{provider_def.name} Models\n", style=f"bold {THEME['text']}")
13422
+ t.append(
13423
+ f" {len(model_list)} locally cached model(s)\n\n", style=THEME["dim"]
13424
+ )
13425
+
13426
+ highlighted_idx = getattr(self, "_local_highlighted_model_index", 0)
13427
+ for idx, model_id in enumerate(model_list, 1):
13428
+ is_highlighted = (idx - 1) == highlighted_idx
13429
+ if is_highlighted:
13430
+ t.append(f" ▶ ", style=f"bold {THEME['success']}")
13431
+ t.append(f"[{idx:2}] ", style=f"bold {THEME['success']}")
13432
+ else:
13433
+ t.append(f" [{idx:2}] ", style=THEME["dim"])
13434
+
13435
+ name_style = (
13436
+ f"bold {THEME['success']}" if is_highlighted else f"bold {THEME['text']}"
13437
+ )
13438
+ t.append(f"{model_id}", style=name_style)
13439
+ if is_highlighted:
13440
+ t.append(f" ← SELECTED", style=f"bold {THEME['success']}")
13441
+ t.append(f"\n", style="")
13442
+
13443
+ t.append(f"\n 💡 ", style=THEME["muted"])
13444
+ t.append("Select a model number or name\n", style=THEME["text"])
13445
+ t.append(f" Use ", style=THEME["muted"])
13446
+ t.append(f":hf search <query>", style=THEME["cyan"])
13447
+ t.append(f" to find and download models\n", style=THEME["muted"])
13448
+
13449
+ log.auto_scroll = False
13450
+ log.clear()
13451
+ log.write(t)
13452
+ self.set_timer(0.1, lambda: setattr(log, "auto_scroll", True))
13453
+ return
13454
+
13455
+ if not models:
13245
13456
  return
13246
13457
 
13247
13458
  provider_def = PROVIDERS.get(provider_id)
@@ -14634,8 +14845,8 @@ team:
14634
14845
  "geminicli": "💎", # Gem (Gemini CLI)
14635
14846
  "codex": "📝", # Memo/code
14636
14847
  "codex.openai.com": "📝", # Memo/code
14637
- "moltbot": "🦞", # Lobster (Moltbot)
14638
- "molt.bot": "🦞", # Lobster (Moltbot)
14848
+ "moltbot": "🦞", # Lobster (OpenClaw)
14849
+ "molt.bot": "🦞", # Lobster (OpenClaw)
14639
14850
  "goose": "🪿", # Goose
14640
14851
  "goose.ai": "🪿", # Goose
14641
14852
  "kimi": "🔮", # Crystal ball (Kimi CLI)