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.
- {superqode-0.1.7/src/superqode.egg-info → superqode-0.1.8}/PKG-INFO +2 -2
- {superqode-0.1.7 → superqode-0.1.8}/README.md +1 -1
- {superqode-0.1.7 → superqode-0.1.8}/pyproject.toml +1 -1
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/__init__.py +1 -1
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp_discovery.py +1 -1
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/molt.bot.toml +13 -13
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app_main.py +287 -76
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/data/superqode-template.yaml +65 -65
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/litellm_gateway.py +9 -9
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/__init__.py +2 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/hub.py +53 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/registry.py +11 -0
- {superqode-0.1.7 → superqode-0.1.8/src/superqode.egg-info}/PKG-INFO +2 -2
- {superqode-0.1.7 → superqode-0.1.8}/LICENSE +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/setup.cfg +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/client.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/permission_screen.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/acp/types.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/edit_strategies.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/loop.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/qe_report_templates.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent/system_prompts.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent_output.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agent_stream.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/acp_registry.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/client.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/augmentcode.com.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/cagent.dev.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/claude.com.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/codeassistant.dev.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/codex.openai.com.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/fastagent.ai.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/geminicli.com.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/goose.block.xyz.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/junie.jetbrains.com.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/kimi.moonshot.cn.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/llmlingagent.dev.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/opencode.ai.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/stakpak.dev.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/data/vtcode.dev.toml +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/discovery.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/messaging.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/persona.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/registry.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/schema.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/agents/unified.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/constants.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/css.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/models.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/suggester.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app/widgets.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/app_enhanced.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/approval.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/atomic.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/acp.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/agents.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/auth.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/config.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/init.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/providers.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/qe.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/roles.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/serve.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/suggestions.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/commands/superqe.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/loader.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/config/schema.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/core/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/core/roles.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/danger.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/design_system.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/model.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/dialogs/provider.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/diff_view.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/enterprise.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/adapters.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/behaviors.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/engine.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/evaluation/scenarios.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/linter.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/modes.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/resolver.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/execution/runner.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/file_explorer.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/file_viewer.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/flash.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/config.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/guidance/prompts.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/accelerator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/config.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/harness/validator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/history.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/integrations/superopt_runner.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/adapters.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/formatter.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/integration.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/sinks.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/logging/unified_log.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/lsp/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/lsp/client.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/main.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/auth_storage.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/client.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/config.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/integration.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/oauth.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/oauth_callback.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/mcp/types.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/feedback.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/memory/store.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/notifications.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/optimization/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/optimization/config.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/permissions/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/permissions/rules.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/plan.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/gateway/openresponses_gateway.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/health.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/downloader.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/endpoints.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/inference.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/huggingface/transformers_runner.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/discovery.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/lmstudio.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/mlx.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/ollama.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/sglang.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/tgi.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/tool_support.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/local/vllm.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/manager.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/models.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/models_dev.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/messages.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/converters/tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/schema/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/schema/models.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/streaming/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/streaming/parser.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/apply_patch.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/code_interpreter.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/file_search.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/openresponses/tools/mcp_adapter.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/providers/usage.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/pure_mode.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/dashboard.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/generator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/qr/templates.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/sandbox.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/safety/warnings.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/lsp_server.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/server/web.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/persistence.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session/sharing.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/session.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/sidebar.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/stream_view.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/styles/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/acp_runner.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/evaluator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/loader.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/constitution/schema.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/events.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/e2e.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/executor.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/javascript.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/python.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/frameworks/registry.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/core_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/registry.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/mcp_tools/testing_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/noise.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/orchestrator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/roles.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/session.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/core_skills.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/skills/registry.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe/verifier.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/superqe_cli.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tool_call.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/agent_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/batch_tool.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/diagnostics.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/edit_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/enhanced_base.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/file_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/file_tracking.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/lsp_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/network_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/permissions.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/question_tool.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/search_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/shell_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/todo_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/validation.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tools/web_tools.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_integration.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/progress.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/tui_widgets/widgets/tool_display.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/undo_manager.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/error_handling.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/utils/fuzzy.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_collab.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_store.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/agent_switcher.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/animation_manager.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/code_context.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/command_palette.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/connection_status.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/conversation_history.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/diff_indicator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/enhanced_status_bar.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/enhanced_toast.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/file_browser.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/file_reference.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/issue_timeline.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/leader_key.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/mode_switcher.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/model_picker.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/permission_preview.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/prompt.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/provider_connect.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/pty_shell.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/qe_dashboard.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/resizable_sidebar.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/response_changes.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/response_display.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/rich_tool_display.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/sidebar_panels.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/slash_complete.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/split_view.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/status_bar.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/superqode_display.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/thinking_display.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/throbber.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/toast.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/widgets/unified_output.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/__init__.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/artifacts.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/coordinator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/diff_tracker.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/git_guard.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/git_snapshot.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/manager.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/snapshot.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/watcher.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode/workspace/worktree.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/SOURCES.txt +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/dependency_links.txt +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/entry_points.txt +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/requires.txt +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/src/superqode.egg-info/top_level.txt +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_acp_client.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_cli_commands.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_linter_runner.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_login_api.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp_integration.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_mcp_live.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_orchestrator.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_oss_integration.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_simple_login.py +0 -0
- {superqode-0.1.7 → superqode-0.1.8}/tests/test_tools.py +0 -0
- {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.
|
|
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 (
|
|
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 (
|
|
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
|
|
|
@@ -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
|
-
#
|
|
2
|
-
# https://
|
|
1
|
+
# OpenClaw
|
|
2
|
+
# https://openclaw.ai/
|
|
3
3
|
|
|
4
4
|
identity = "molt.bot"
|
|
5
|
-
name = "
|
|
5
|
+
name = "OpenClaw"
|
|
6
6
|
short_name = "moltbot"
|
|
7
|
-
url = "https://
|
|
7
|
+
url = "https://openclaw.ai/"
|
|
8
8
|
protocol = "acp"
|
|
9
|
-
author_name = "
|
|
10
|
-
author_url = "https://
|
|
11
|
-
publisher_name = "
|
|
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 = "
|
|
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
|
-
#
|
|
19
|
+
# OpenClaw
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
OpenClaw provides an ACP bridge that connects SuperQode to a running OpenClaw Gateway.
|
|
22
22
|
|
|
23
23
|
## Requirements
|
|
24
24
|
|
|
25
|
-
-
|
|
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://
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
12669
|
-
|
|
12670
|
-
|
|
12671
|
-
|
|
12672
|
-
|
|
12673
|
-
|
|
12674
|
-
|
|
12675
|
-
|
|
12676
|
-
|
|
12677
|
-
|
|
12678
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12683
|
-
|
|
12684
|
-
|
|
12685
|
-
|
|
12686
|
-
|
|
12687
|
-
|
|
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
|
-
|
|
12704
|
-
|
|
12705
|
-
|
|
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 (
|
|
12953
|
-
if provider_id == "huggingface":
|
|
12954
|
-
|
|
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
|
-
|
|
12958
|
-
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
12985
|
-
|
|
13145
|
+
if cached_models:
|
|
13146
|
+
for idx, model_id in enumerate(cached_models, 1):
|
|
13147
|
+
is_highlighted = (idx - 1) == highlighted_idx
|
|
12986
13148
|
|
|
12987
|
-
|
|
12988
|
-
|
|
12989
|
-
|
|
12990
|
-
|
|
12991
|
-
|
|
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
|
-
|
|
12994
|
-
|
|
12995
|
-
|
|
12996
|
-
|
|
12997
|
-
|
|
12998
|
-
|
|
12999
|
-
|
|
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"
|
|
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
|
|
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
|
|
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 (
|
|
14638
|
-
"molt.bot": "🦞", # Lobster (
|
|
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)
|