crabcode 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.
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/windows-compat.yml +1 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/PKG-INFO +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/README.md +2 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/README.zh-CN.md +2 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/pyproject.toml +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/Cargo.lock +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/Cargo.toml +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/Cargo.toml +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/_version.py +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/anthropic_adapter.py +4 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/azure_adapter.py +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/base.py +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/codex_adapter.py +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/model_discovery.py +66 -5
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/network.py +12 -5
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/openai_adapter.py +4 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/pyproject.toml +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/pyproject.toml +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/package-lock.json +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/package.json +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/GroupModelDiscovery.test.tsx +7 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/GroupModelDiscovery.tsx +14 -4
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ModelSettingsPanel.tsx +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/types.ts +9 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/Cargo.lock +3 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/Cargo.toml +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/tauri.conf.json +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/config.py +11 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/schemas.py +24 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/pyproject.toml +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/pyproject.toml +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/de.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/en.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/es.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/fr.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ja.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ko.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/pt-BR.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ru.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/zh-CN.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/zh-TW.json +2 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/README.md +7 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package-lock.json +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.json +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package-lock.json +2 -2
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.json +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/types.ts +20 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/gatewayManager.ts +39 -14
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/webview.ts +13 -3
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +6 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/gatewayManager.test.cjs +95 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/pyproject.toml +1 -1
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_discovery.py +109 -0
- crabcode-0.1.8/tests/test_sdk_transport_compat.py +42 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/actions/client-apple-signing/action.yml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/client-packages.yml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/computer-use.yml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/document-engine-wheels.yml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/python-publish.yml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/.gitignore +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/__main__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/app.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/banner.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/model_manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/model_picker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/pipe.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/render/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/render/messages.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/repl.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/session_picker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/hatch_build.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/Cargo.toml +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/README.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/build.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/channel.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/channel.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nativeClient.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nativeClient.d.cts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nodeChannel.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nodeChannel.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/package.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/src/channel.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/vscodeHost.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/vscodeHost.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/lib.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/build.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/lib.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/main.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/permission_guide.m +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/windows.rc +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/PROMPT.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.icns +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.ico +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/build-icons.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/build.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/check-wheel.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/live-smoke.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/_windows_process.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/agent_manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/error_logging.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/gemini_adapter.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/model_info.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/ollama_adapter.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/registry.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/command_line.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/compact.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/computer_use_mode.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/computer_use_observation.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/claudemd.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/model_catalog.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/events.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/file_lock.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/filesystem.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/goal.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/hooks/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/hooks/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/image_io.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/io_worker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/logging_utils.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/client.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/client.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/config.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/path_validation.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/paths.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/peer/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/peer/runtime.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/executor.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/types.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/blocks.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/context.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/library.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/profile.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/system.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/templates.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/loop.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/retry.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/models.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/store.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/timing.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/export.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/meta_db.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/storage.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/title_gen.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/context.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/loader.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/matcher.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/subprocess_utils.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/bridge.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/inbox.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/manager.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/message_bus.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/models.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/recovery.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/text_io.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/agent.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/ask_user.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/bash.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/browser.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/checklist.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_edit.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_read.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_write.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/glob.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/goal.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/grep.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/image.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/image_generate.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/lint.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/loading.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/memory.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/monitor.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/peer.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/revert.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/schedule.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/skill.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/team.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/tool_search.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/web_search.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/turn_details.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/config.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/event.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/message.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/tool.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/usage.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/adapters.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/dap.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/memory.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/process.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/runtime.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/sessions.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/tool.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/README.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/THEMES.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/index.html +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.startup.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ApprovalShortcutSettings.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReview.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReview.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReviewControls.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ComposerEditor.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ConversationTurns.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/CopyButton.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentViewTabs.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.files.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FileEditSummaryCard.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FollowUpQueue.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ModelSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ProjectFilesWorkspace.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PromptSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PromptSettingsPanel.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ReviewMenu.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/RuntimeSettingsPanel.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SettingsView.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SettingsView.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/StatusBar.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/StatusBar.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TrajectoryView.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TrajectoryView.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TurnDetailsButton.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.css +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/VirtualMachineSettings.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/approvalShortcuts.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/computerUse.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/computerUse.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/desktopSlashCommands.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/diffRows.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/events.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/events.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/favorites.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/favorites.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/fileEditSummary.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/fileEditSummary.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gateway.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gateway.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayErrors.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayStartup.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayStartup.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/i18n.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/lumeInstaller.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/main.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/markdownMath.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.lume.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.startup.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/pathUtils.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/permissionPresentation.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/platform.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/promptTemplateFile.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/reviewHistory.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/sessionNotifications.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/sessionNotifications.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/styles.css +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/taskbarProgress.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/taskbarProgress.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/theme.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/theme.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/themePackages.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/themePackages.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/toolPresentation.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/toolPresentation.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/turnDetails.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useGitReview.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useGitReview.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useProjectModels.test.tsx +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useProjectModels.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/userPromptDisplay.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/uuid.test.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/uuid.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/virtualMachine.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/vite-env.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/build.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/capabilities/default.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/128x128.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/32x32.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.icns +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.ico +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/gateway.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/lib.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/main.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/paths.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/settings.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/tsconfig.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/vite.config.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/adapter.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/auth.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/middleware.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/protocol.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/server.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/__init__.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/background.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/chunker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/embedder.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/indexer.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/store.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/tool.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/README.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/index.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/index.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/metadata.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/metadata.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/runtime.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/runtime.test.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/package.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/slashCommands.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/slashCommands.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/turnProcess.d.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/turnProcess.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.gitignore +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.nvmrc +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscode/launch.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscode/tasks.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscodeignore +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/CHANGELOG.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/LICENSE +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/.vscodeignore +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/LICENSE +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/README.md +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/esbuild.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/extension.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.de.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.es.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.fr.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ja.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ko.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.pt-br.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ru.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/esbuild.js +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/logo.png +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.de.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.es.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.fr.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ja.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ko.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.pt-br.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ru.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/resources/icon.svg +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/scripts/gen-types.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/chatPanel.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/permissionPresentation.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/protocol.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/computerUse.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/connection.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/crabCodeSettingsPanel.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/extension.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/i18n.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/ideContext.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/pendingEdits.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/promptTemplateFile.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/runtimeControls.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/catalog.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/protocol.ts +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/webview.css +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseController.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseNative.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/contextUsage.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/followUp.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/i18n.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/settingsHarness.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/i18n.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/ideContext.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/imageCaptions.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/permissionPolicy.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/slashCommands.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/streamRetry.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/turnDetails.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/turnProcess.test.cjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tsconfig.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tsconfig.webview.json +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/audit_tool_cards.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/build_document_engine_bundle.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/i18n.mjs +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/package_clients.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/prompt_budget.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/scripts/sync_version.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_api_error_logging.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_apply_patch.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_api_recovery.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_composer.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_model_management.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_model_picker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_session_picker.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_yolo.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_client_packaging.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_codex_context_window.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_compact_prompt.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_compaction_settings.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_ax.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_history.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_observation.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_packaging.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_policy.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_window_observations.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_config_home.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_context_token_accounting.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_follow_up_messages.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_new_session_controls.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_runtime_info.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_send_message.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_git_review.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_image_context.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_image_tool.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_io_isolation.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_connection.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_info.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_settings_delete.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_network_policy.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_openai_tool_images.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_permission_policy_status.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_project_model_catalog.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_prompt_loading.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_prompt_settings.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_read_images.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_reasoning_effort.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_resume_model.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_session_storage_performance.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_stream_reconnect.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_tool_loading.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_turn_details.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_usage.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_web_search.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_windows_audit_regressions.py +0 -0
- {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_windows_compat.py +0 -0
|
@@ -32,6 +32,7 @@ jobs:
|
|
|
32
32
|
- run: python -m pip install -e . fastapi pypdf python-multipart pytest
|
|
33
33
|
- run: python -m unittest discover -s tests -p "test_windows*.py" -v
|
|
34
34
|
- run: python -m pytest tests/test_cli_computer_use.py -q
|
|
35
|
+
- run: python -m pytest tests/test_sdk_transport_compat.py tests/test_network_policy.py -q
|
|
35
36
|
|
|
36
37
|
windows-clients:
|
|
37
38
|
runs-on: windows-latest
|
|
@@ -580,6 +580,8 @@ For DeepSeek V4 thinking mode with tool calls, enable reasoning pass-through:
|
|
|
580
580
|
|
|
581
581
|
CrabCode automatically manages the context window to prevent `400 token limit exceeded` errors.
|
|
582
582
|
|
|
583
|
+
When importing new models with **Get model list** on a configuration group in Desktop or VS Code, CrabCode saves context and output limits supplied by `/models`. It recognizes Anthropic's `max_input_tokens` / `max_tokens`, OpenRouter's `context_length` / `top_provider.max_completion_tokens`, and common compatible API limit fields, using the smaller limit when several are present. Explicit thinking capability metadata configures the thinking switch; Anthropic thinking budgets are kept below the output limit. Explicit group context overrides, smaller output budgets, and disabled thinking are preserved. Existing model profiles are untouched, and missing metadata continues to inherit settings or use runtime defaults. Temperature, reasoning effort, prices, and image/tool capabilities are not inferred from model names or automatically changed.
|
|
584
|
+
|
|
583
585
|
**How context window size is resolved** (in priority order):
|
|
584
586
|
|
|
585
587
|
1. `context_window` field in your `api` config (explicit override)
|
|
@@ -569,6 +569,8 @@ DeepSeek V4 思考模式配合工具调用时,需要开启 reasoning 回传:
|
|
|
569
569
|
|
|
570
570
|
CrabCode 会自动管理上下文窗口,防止因 token 超限导致 `400` 报错。
|
|
571
571
|
|
|
572
|
+
在 Desktop 或 VS Code 的模型设置中,从配置组「获取模型列表」并导入新模型时,会自动保存 `/models` 返回的上下文窗口和最大输出 token 数。支持 Anthropic 的 `max_input_tokens` / `max_tokens`、OpenRouter 的 `context_length` / `top_provider.max_completion_tokens`,以及兼容接口的常见限制字段;有多项限制时取较小值。接口明确提供思考能力时会设置思考开关,Anthropic 的思考预算也会限制在输出上限以内。配置组中手动指定的上下文窗口、较小的输出预算和关闭思考的偏好会保留;已有模型不会被覆盖,接口未提供的字段继续继承配置或使用运行时默认值。温度、思考强度、价格和图像/工具能力不会根据模型名称推测或自动改写。
|
|
573
|
+
|
|
572
574
|
**上下文窗口大小的解析优先级:**
|
|
573
575
|
|
|
574
576
|
1. `api` 配置中显式指定的 `context_window` 字段
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "crabcode-cli"
|
|
3
3
|
# Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
|
|
4
|
-
version = "0.1.
|
|
4
|
+
version = "0.1.8"
|
|
5
5
|
description = "CrabCode CLI - terminal frontend for CrabCode"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"crabcode-core>=0.1.
|
|
8
|
+
"crabcode-core>=0.1.8",
|
|
9
9
|
"typer>=0.12.0",
|
|
10
10
|
"rich>=13.0.0",
|
|
11
11
|
"prompt-toolkit>=3.0.0",
|
|
@@ -402,7 +402,7 @@ dependencies = [
|
|
|
402
402
|
|
|
403
403
|
[[package]]
|
|
404
404
|
name = "crabcode-computer-use-core"
|
|
405
|
-
version = "0.1.
|
|
405
|
+
version = "0.1.8"
|
|
406
406
|
dependencies = [
|
|
407
407
|
"base64",
|
|
408
408
|
"core-foundation",
|
|
@@ -423,7 +423,7 @@ dependencies = [
|
|
|
423
423
|
|
|
424
424
|
[[package]]
|
|
425
425
|
name = "crabcode-computer-use-host"
|
|
426
|
-
version = "0.1.
|
|
426
|
+
version = "0.1.8"
|
|
427
427
|
dependencies = [
|
|
428
428
|
"cc",
|
|
429
429
|
"crabcode-computer-use-core",
|
|
@@ -123,6 +123,7 @@ def _tools_to_api(tools: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
|
123
123
|
class AnthropicAdapter(APIAdapter):
|
|
124
124
|
"""Adapter for Anthropic's Messages API (direct, first-party)."""
|
|
125
125
|
|
|
126
|
+
_sdk = anthropic
|
|
126
127
|
emits_response_item_events = True
|
|
127
128
|
|
|
128
129
|
def __init__(self, config: ApiConfig):
|
|
@@ -143,7 +144,7 @@ class AnthropicAdapter(APIAdapter):
|
|
|
143
144
|
kwargs["default_headers"] = config.http_headers
|
|
144
145
|
|
|
145
146
|
from crabcode_core.api.network import sdk_options
|
|
146
|
-
self.client = anthropic.AsyncAnthropic(**kwargs, **sdk_options(config))
|
|
147
|
+
self.client = anthropic.AsyncAnthropic(**kwargs, **sdk_options(config, self._sdk))
|
|
147
148
|
self._api_key = api_key
|
|
148
149
|
|
|
149
150
|
def _messages_url(self) -> str | None:
|
|
@@ -632,7 +633,7 @@ class BedrockAdapter(AnthropicAdapter):
|
|
|
632
633
|
def __init__(self, config: ApiConfig):
|
|
633
634
|
self.config = config
|
|
634
635
|
from crabcode_core.api.network import sdk_options
|
|
635
|
-
self.client = anthropic.AsyncAnthropicBedrock(**sdk_options(config))
|
|
636
|
+
self.client = anthropic.AsyncAnthropicBedrock(**sdk_options(config, self._sdk))
|
|
636
637
|
|
|
637
638
|
|
|
638
639
|
class VertexAdapter(AnthropicAdapter):
|
|
@@ -644,5 +645,5 @@ class VertexAdapter(AnthropicAdapter):
|
|
|
644
645
|
self.client = anthropic.AsyncAnthropicVertex(
|
|
645
646
|
region=os.environ.get("CLOUD_ML_REGION", "us-east5"),
|
|
646
647
|
project_id=os.environ.get("ANTHROPIC_VERTEX_PROJECT_ID"),
|
|
647
|
-
**sdk_options(config),
|
|
648
|
+
**sdk_options(config, self._sdk),
|
|
648
649
|
)
|
|
@@ -57,7 +57,7 @@ class AzureOpenAIAdapter(OpenAIAdapter):
|
|
|
57
57
|
kwargs["default_headers"] = config.http_headers
|
|
58
58
|
|
|
59
59
|
from crabcode_core.api.network import sdk_options
|
|
60
|
-
return openai.AsyncAzureOpenAI(**kwargs, **sdk_options(config))
|
|
60
|
+
return openai.AsyncAzureOpenAI(**kwargs, **sdk_options(config, self._sdk))
|
|
61
61
|
|
|
62
62
|
def _resolve_model(self, config: ModelConfig) -> str:
|
|
63
63
|
"""Azure uses deployment names instead of model names."""
|
|
@@ -188,13 +188,13 @@ class APIAdapter(ABC):
|
|
|
188
188
|
async def reset_network_client(self) -> None:
|
|
189
189
|
"""Replace a failed SDK connection pool without changing its routing policy."""
|
|
190
190
|
import asyncio
|
|
191
|
-
from crabcode_core.api.network import
|
|
191
|
+
from crabcode_core.api.network import sdk_http_client
|
|
192
192
|
|
|
193
193
|
client = getattr(self, "client", None)
|
|
194
194
|
copy = getattr(client, "with_options", None)
|
|
195
195
|
if not callable(copy):
|
|
196
196
|
return
|
|
197
|
-
transport =
|
|
197
|
+
transport = sdk_http_client(self.config, getattr(self, "_sdk", None))
|
|
198
198
|
try:
|
|
199
199
|
replacement = copy(http_client=transport, max_retries=0)
|
|
200
200
|
except BaseException:
|
|
@@ -486,6 +486,7 @@ class CodexAdapter(APIAdapter):
|
|
|
486
486
|
def __init__(self, config: ApiConfig):
|
|
487
487
|
import openai
|
|
488
488
|
|
|
489
|
+
self._sdk = openai
|
|
489
490
|
self.config = config
|
|
490
491
|
api_key = None
|
|
491
492
|
oauth_account_id = None
|
|
@@ -524,7 +525,7 @@ class CodexAdapter(APIAdapter):
|
|
|
524
525
|
# differing built-in policy (which also retries 429) and apply the
|
|
525
526
|
# configured policy explicitly in _create_sdk_response_stream().
|
|
526
527
|
from crabcode_core.api.network import sdk_options
|
|
527
|
-
kwargs.update(sdk_options(config))
|
|
528
|
+
kwargs.update(sdk_options(config, self._sdk))
|
|
528
529
|
self.client = openai.AsyncOpenAI(**kwargs)
|
|
529
530
|
|
|
530
531
|
async def resolve_context_window(self) -> int:
|
|
@@ -6,6 +6,7 @@ import asyncio
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
from collections.abc import Mapping
|
|
9
|
+
from typing import Any
|
|
9
10
|
from urllib.parse import urlsplit, urlunsplit
|
|
10
11
|
|
|
11
12
|
import httpx
|
|
@@ -18,6 +19,63 @@ class ModelDiscoveryError(ValueError):
|
|
|
18
19
|
"""A safe, user-facing discovery error (never a raw provider response)."""
|
|
19
20
|
|
|
20
21
|
|
|
22
|
+
def _token_limit(*values: Any) -> int | None:
|
|
23
|
+
# Metadata is optional: ignore malformed values without losing the catalog.
|
|
24
|
+
limits = [value for value in values if type(value) is int and 0 < value <= 2_147_483_647]
|
|
25
|
+
return min(limits) if limits else None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _model_metadata(entry: Mapping[str, Any]) -> dict[str, Any]:
|
|
29
|
+
"""Normalize explicit limits; never guess capabilities from a model name."""
|
|
30
|
+
# https://platform.claude.com/docs/en/api/models/list
|
|
31
|
+
# https://openrouter.ai/docs/api/api-reference/models/list-all-models-and-their-properties
|
|
32
|
+
top = entry.get("top_provider")
|
|
33
|
+
top = top if isinstance(top, dict) else {}
|
|
34
|
+
result: dict[str, Any] = {}
|
|
35
|
+
context = _token_limit(*(entry.get(key) for key in (
|
|
36
|
+
"context_length", "context_window", "max_context_length", "max_model_len", "max_input_tokens",
|
|
37
|
+
)), top.get("context_length"))
|
|
38
|
+
output = _token_limit(*(entry.get(key) for key in (
|
|
39
|
+
"max_output_tokens", "max_completion_tokens", "max_tokens",
|
|
40
|
+
)), top.get("max_completion_tokens"))
|
|
41
|
+
if context is not None:
|
|
42
|
+
result["context_window"] = context
|
|
43
|
+
if output is not None:
|
|
44
|
+
result["max_tokens"] = output
|
|
45
|
+
capabilities = entry.get("capabilities")
|
|
46
|
+
thinking = capabilities.get("thinking") if isinstance(capabilities, dict) else None
|
|
47
|
+
supported = thinking.get("supported") if isinstance(thinking, dict) else None
|
|
48
|
+
if type(supported) is bool:
|
|
49
|
+
result["thinking_enabled"] = supported
|
|
50
|
+
return result
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def model_import_config(metadata: Mapping[str, Any], group: ApiConfig) -> dict[str, Any]:
|
|
54
|
+
"""Apply only supported settings, retaining explicit group preferences."""
|
|
55
|
+
result: dict[str, Any] = {}
|
|
56
|
+
context = _token_limit(metadata.get("context_window"))
|
|
57
|
+
if context is not None and group.context_window is None:
|
|
58
|
+
result["context_window"] = context
|
|
59
|
+
output = _token_limit(metadata.get("max_tokens"))
|
|
60
|
+
if output is not None:
|
|
61
|
+
# A deliberately smaller output budget stays in force. Otherwise use
|
|
62
|
+
# the published model limit instead of the generic 16k default.
|
|
63
|
+
result["max_tokens"] = min(output, group.max_tokens) if "max_tokens" in group.model_fields_set else output
|
|
64
|
+
thinking = metadata.get("thinking_enabled")
|
|
65
|
+
if type(thinking) is bool:
|
|
66
|
+
result["thinking_enabled"] = thinking and group.thinking_enabled
|
|
67
|
+
protocol = (group.format or "openai") if group.provider == "router" else (group.provider or "anthropic")
|
|
68
|
+
if protocol == "anthropic" and output is not None and result.get("thinking_enabled", group.thinking_enabled):
|
|
69
|
+
# Anthropic budgeted thinking requires at least 1024 tokens, strictly
|
|
70
|
+
# below max_tokens. Importing a smaller limit must not break requests.
|
|
71
|
+
budget = min(group.thinking_budget, result["max_tokens"] - 1)
|
|
72
|
+
if budget < 1024:
|
|
73
|
+
result["thinking_enabled"] = False
|
|
74
|
+
elif budget != group.thinking_budget:
|
|
75
|
+
result["thinking_budget"] = budget
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
|
|
21
79
|
def _connection(config: ApiConfig, env: Mapping[str, str]) -> tuple[str, httpx.Headers, bool]:
|
|
22
80
|
provider = config.provider or "anthropic"
|
|
23
81
|
protocol = (config.format or "openai") if provider == "router" else provider
|
|
@@ -63,9 +121,9 @@ def _connection(config: ApiConfig, env: Mapping[str, str]) -> tuple[str, httpx.H
|
|
|
63
121
|
return endpoint, headers, anthropic
|
|
64
122
|
|
|
65
123
|
|
|
66
|
-
async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str,
|
|
124
|
+
async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, Any]]:
|
|
67
125
|
endpoint, headers, anthropic = _connection(config, env)
|
|
68
|
-
models: dict[str, dict[str,
|
|
126
|
+
models: dict[str, dict[str, Any]] = {}
|
|
69
127
|
cursors: set[str] = set()
|
|
70
128
|
params: dict[str, str | int] = {"limit": 1000} if anthropic else {}
|
|
71
129
|
remaining_bytes = 4 * 1024 * 1024
|
|
@@ -93,10 +151,13 @@ async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, st
|
|
|
93
151
|
if not isinstance(model_id, str) or not model_id.strip() or len(model_id) > 512 or any(ord(char) < 32 for char in model_id):
|
|
94
152
|
raise ModelDiscoveryError("模型列表包含无效的模型 ID,请检查服务端响应")
|
|
95
153
|
model_id = model_id.strip()
|
|
96
|
-
model = {"id": model_id}
|
|
97
|
-
display_name = entry.get("display_name")
|
|
154
|
+
model: dict[str, Any] = {"id": model_id}
|
|
155
|
+
display_name = entry.get("display_name") or entry.get("name")
|
|
98
156
|
if isinstance(display_name, str) and display_name.strip():
|
|
99
157
|
model["name"] = display_name.strip()[:512]
|
|
158
|
+
settings = model_import_config(_model_metadata(entry), config)
|
|
159
|
+
if settings:
|
|
160
|
+
model["config"] = settings
|
|
100
161
|
models.setdefault(model_id, model)
|
|
101
162
|
if len(models) > 5000:
|
|
102
163
|
raise ModelDiscoveryError("模型列表过大,请缩小服务端返回范围后重试")
|
|
@@ -110,7 +171,7 @@ async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, st
|
|
|
110
171
|
raise ModelDiscoveryError("模型列表分页过多,请缩小服务端返回范围后重试")
|
|
111
172
|
|
|
112
173
|
|
|
113
|
-
async def discover_models(config: ApiConfig, settings_env: Mapping[str, str] | None = None) -> list[dict[str,
|
|
174
|
+
async def discover_models(config: ApiConfig, settings_env: Mapping[str, str] | None = None) -> list[dict[str, Any]]:
|
|
114
175
|
try:
|
|
115
176
|
# Match session initialization's setdefault precedence without mutating
|
|
116
177
|
# the Gateway environment or requiring an initialized chat session.
|
|
@@ -26,17 +26,24 @@ def http_options(config: Any) -> dict[str, Any]:
|
|
|
26
26
|
return {"trust_env": False, "proxy": proxy}
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def request_timeout(config: Any) ->
|
|
29
|
+
def request_timeout(config: Any, sdk: Any = None) -> Any:
|
|
30
30
|
timeout = float(getattr(config, "timeout", 300))
|
|
31
|
-
|
|
31
|
+
# SDK exports follow their supported transport (httpx or httpx2).
|
|
32
|
+
timeout_type = sdk.Timeout if sdk is not None else httpx.Timeout
|
|
33
|
+
return timeout_type(timeout, connect=min(timeout, 10.0))
|
|
32
34
|
|
|
33
35
|
|
|
34
|
-
def
|
|
36
|
+
def sdk_http_client(config: Any, sdk: Any = None) -> Any:
|
|
37
|
+
client_type = sdk.DefaultAsyncHttpxClient if sdk is not None else httpx.AsyncClient
|
|
38
|
+
return client_type(**http_options(config), timeout=request_timeout(config, sdk))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def sdk_options(config: Any, sdk: Any) -> dict[str, Any]:
|
|
35
42
|
# The query loop owns retry budgets; nested SDK retries hide progress.
|
|
36
|
-
options: dict[str, Any] = {"max_retries": 0, "timeout": request_timeout(config)}
|
|
43
|
+
options: dict[str, Any] = {"max_retries": 0, "timeout": request_timeout(config, sdk)}
|
|
37
44
|
routing = http_options(config)
|
|
38
45
|
if routing:
|
|
39
|
-
options["http_client"] =
|
|
46
|
+
options["http_client"] = sdk_http_client(config, sdk)
|
|
40
47
|
return options
|
|
41
48
|
|
|
42
49
|
|
|
@@ -168,6 +168,9 @@ class OpenAIAdapter(APIAdapter):
|
|
|
168
168
|
"""
|
|
169
169
|
|
|
170
170
|
def __init__(self, config: ApiConfig):
|
|
171
|
+
import openai
|
|
172
|
+
|
|
173
|
+
self._sdk = openai
|
|
171
174
|
self.config = config
|
|
172
175
|
self.client = self._create_client(config)
|
|
173
176
|
|
|
@@ -190,7 +193,7 @@ class OpenAIAdapter(APIAdapter):
|
|
|
190
193
|
kwargs["default_headers"] = config.http_headers
|
|
191
194
|
|
|
192
195
|
from crabcode_core.api.network import sdk_options
|
|
193
|
-
return openai.AsyncOpenAI(**kwargs, **sdk_options(config))
|
|
196
|
+
return openai.AsyncOpenAI(**kwargs, **sdk_options(config, self._sdk))
|
|
194
197
|
|
|
195
198
|
def _resolve_model(self, config: ModelConfig) -> str:
|
|
196
199
|
"""Resolve the model name for the API call. Override in subclasses."""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "crabcode-core"
|
|
3
3
|
# Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
|
|
4
|
-
version = "0.1.
|
|
4
|
+
version = "0.1.8"
|
|
5
5
|
description = "CrabCode core library - AI coding assistant engine"
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
dependencies = [
|
|
@@ -5,11 +5,11 @@ build-backend = "hatchling.build"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "crabcode-debugger"
|
|
7
7
|
# Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
|
|
8
|
-
version = "0.1.
|
|
8
|
+
version = "0.1.8"
|
|
9
9
|
description = "DAP and process-level debugging tools for CrabCode"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
dependencies = [
|
|
12
|
-
"crabcode-core>=0.1.
|
|
12
|
+
"crabcode-core>=0.1.8",
|
|
13
13
|
]
|
|
14
14
|
|
|
15
15
|
[tool.hatch.build.targets.wheel]
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crabcode-desktop",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "crabcode-desktop",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.8",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@tauri-apps/api": "^2.8.0",
|
|
12
12
|
"@tauri-apps/plugin-global-shortcut": "^2.3.2",
|
|
@@ -12,12 +12,13 @@ const data: ModelSettingsResponse = {
|
|
|
12
12
|
editable_sources: [{ id: "userSettings", label: "用户配置", path: "/user/settings.json", exists: true, writable: true }],
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
it("
|
|
15
|
+
it("previews discovered settings and imports metadata only for selected new models", async () => {
|
|
16
16
|
(globalThis as unknown as { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
|
|
17
17
|
const container = document.createElement("div");
|
|
18
18
|
document.body.append(container);
|
|
19
19
|
const root = createRoot(container);
|
|
20
|
-
const
|
|
20
|
+
const config = { context_window: 131072, max_tokens: 8192, thinking_enabled: false };
|
|
21
|
+
const onDiscover = vi.fn(async () => ({ group: "shared", models: [{ id: "old", config }, { id: "org/new", config }, { id: "other", config }] }));
|
|
21
22
|
const onMutate = vi.fn().mockRejectedValueOnce(new Error("write failed")).mockResolvedValue(undefined);
|
|
22
23
|
const props = { activeConnection: null, activeProject: null, gateway: { status: "online" } as GatewayViewState, data, loading: false, error: null, onRefresh: () => {}, onMutate, onDiscover };
|
|
23
24
|
const click = async (text: string) => act(async () => [...container.querySelectorAll<HTMLButtonElement>("button")].find(button => button.textContent === text)!.click());
|
|
@@ -28,12 +29,15 @@ it("opens discovery on the group and only imports selected new model IDs", async
|
|
|
28
29
|
expect(onDiscover).toHaveBeenCalledWith("shared");
|
|
29
30
|
expect(container.querySelector<HTMLInputElement>('[aria-label="old"]')!.disabled).toBe(true);
|
|
30
31
|
expect(onMutate).not.toHaveBeenCalled();
|
|
32
|
+
expect(container.textContent).toContain("上下文窗口: 131072");
|
|
33
|
+
expect(container.textContent).toContain("最大输出 Token: 8192");
|
|
34
|
+
expect(container.textContent).toContain("思考: 关闭");
|
|
31
35
|
await act(async () => container.querySelector<HTMLInputElement>('[aria-label="org/new"]')!.click());
|
|
32
36
|
await click("添加所选模型");
|
|
33
37
|
expect(container.querySelector('[role="alert"]')?.textContent).toContain("write failed");
|
|
34
38
|
expect(container.querySelector<HTMLInputElement>('[aria-label="org/new"]')!.checked).toBe(true);
|
|
35
39
|
await click("添加所选模型");
|
|
36
|
-
expect(onMutate).toHaveBeenLastCalledWith({ action: "import_group_models", name: "shared", source: "userSettings", cwd: undefined, model_ids: ["org/new"] });
|
|
40
|
+
expect(onMutate).toHaveBeenLastCalledWith({ action: "import_group_models", name: "shared", source: "userSettings", cwd: undefined, model_ids: ["org/new"], model_metadata: { "org/new": config } });
|
|
37
41
|
expect(container.querySelector('[role="dialog"]')).toBeNull();
|
|
38
42
|
} finally {
|
|
39
43
|
await act(async () => root.unmount());
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { useEffect, useRef, useState } from "react";
|
|
2
2
|
import { Download, LoaderCircle, RefreshCw, X } from "lucide-react";
|
|
3
3
|
import { t as tr } from "./i18n";
|
|
4
|
-
import type { ModelDiscoveryResponse } from "./types";
|
|
4
|
+
import type { DiscoveredModelSettings, ModelDiscoveryResponse } from "./types";
|
|
5
5
|
|
|
6
6
|
export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscover, onImport, onClose }: {
|
|
7
7
|
group: string;
|
|
8
8
|
sourceLabel: string;
|
|
9
9
|
existingIds: Set<string>;
|
|
10
10
|
onDiscover: (group: string) => Promise<ModelDiscoveryResponse>;
|
|
11
|
-
onImport: (ids: string[]) => Promise<void>;
|
|
11
|
+
onImport: (ids: string[], metadata: Record<string, DiscoveredModelSettings>) => Promise<void>;
|
|
12
12
|
onClose: () => void;
|
|
13
13
|
}) {
|
|
14
14
|
const [models, setModels] = useState<ModelDiscoveryResponse["models"] | null>(null);
|
|
@@ -46,7 +46,10 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
|
|
|
46
46
|
setSaving(true);
|
|
47
47
|
setError(null);
|
|
48
48
|
try {
|
|
49
|
-
|
|
49
|
+
const metadata = Object.fromEntries((models ?? [])
|
|
50
|
+
.filter(model => selectedIds.includes(model.id) && model.config)
|
|
51
|
+
.map(model => [model.id, model.config!]));
|
|
52
|
+
await onImport(selectedIds, metadata);
|
|
50
53
|
onClose();
|
|
51
54
|
} catch (reason) {
|
|
52
55
|
setError(reason instanceof Error ? reason.message : String(reason));
|
|
@@ -66,6 +69,7 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
|
|
|
66
69
|
</header>
|
|
67
70
|
<div className="model-editor-body">
|
|
68
71
|
<p className="model-discovery-description">{tr("选择要加入配置组的模型,已有模型会保留原配置。")}</p>
|
|
72
|
+
<p className="model-discovery-description">{tr("导入时自动填写接口提供的上下文、输出和思考设置;未提供的字段沿用现有配置。")}</p>
|
|
69
73
|
<div className="model-discovery-toolbar">
|
|
70
74
|
<input type="search" aria-label={tr("搜索模型")} placeholder={tr("搜索模型")} value={query} onChange={event => setQuery(event.target.value)} disabled={saving} autoFocus />
|
|
71
75
|
<button type="button" className="settings-command" disabled={loading || saving} onClick={() => void refresh()}><RefreshCw />{tr("刷新")}</button>
|
|
@@ -95,7 +99,13 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
|
|
|
95
99
|
return next;
|
|
96
100
|
});
|
|
97
101
|
}} />
|
|
98
|
-
<span><strong>{model.id}</strong>{model.name && model.name !== model.id && <small>{model.name}</small>}
|
|
102
|
+
<span><strong>{model.id}</strong>{model.name && model.name !== model.id && <small>{model.name}</small>}
|
|
103
|
+
{model.config && <small>{[
|
|
104
|
+
model.config.context_window != null && `${tr("上下文窗口")}: ${model.config.context_window}`,
|
|
105
|
+
model.config.max_tokens != null && `${tr("最大输出 Token")}: ${model.config.max_tokens}`,
|
|
106
|
+
model.config.thinking_enabled != null && `${tr("思考")}: ${model.config.thinking_enabled ? tr("开启") : tr("关闭")}`,
|
|
107
|
+
].filter(Boolean).join(" · ")}</small>}
|
|
108
|
+
</span>
|
|
99
109
|
{existingIds.has(model.id) && <small>{tr("已添加")}</small>}
|
|
100
110
|
</label>)}
|
|
101
111
|
{!visible.length && <p className="settings-list-empty">{models.length ? tr("没有匹配的模型") : tr("接口未返回可用模型")}</p>}
|
|
@@ -807,7 +807,7 @@ export function ModelSettingsPanel({
|
|
|
807
807
|
sourceLabel={sourceOptions.find(item => item.id === discovery.source)?.label ?? discovery.source}
|
|
808
808
|
existingIds={new Set(data.models.filter(model => model.group === discovery.group).map(model => String(model.effective.model ?? "")))}
|
|
809
809
|
onDiscover={onDiscover}
|
|
810
|
-
onImport={model_ids => mutate({ action: "import_group_models", name: discovery.group, source: discovery.source, cwd: activeProject?.path, model_ids })}
|
|
810
|
+
onImport={(model_ids, model_metadata) => mutate({ action: "import_group_models", name: discovery.group, source: discovery.source, cwd: activeProject?.path, model_ids, model_metadata })}
|
|
811
811
|
onClose={() => setDiscovery(null)}
|
|
812
812
|
/>
|
|
813
813
|
)}
|
|
@@ -586,11 +586,19 @@ export interface ModelSettingsMutation {
|
|
|
586
586
|
config?: Record<string, unknown>;
|
|
587
587
|
remove_fields?: string[];
|
|
588
588
|
model_ids?: string[];
|
|
589
|
+
model_metadata?: Record<string, DiscoveredModelSettings>;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
export interface DiscoveredModelSettings {
|
|
593
|
+
context_window?: number | null;
|
|
594
|
+
max_tokens?: number | null;
|
|
595
|
+
thinking_enabled?: boolean | null;
|
|
596
|
+
thinking_budget?: number | null;
|
|
589
597
|
}
|
|
590
598
|
|
|
591
599
|
export interface ModelDiscoveryResponse {
|
|
592
600
|
group: string;
|
|
593
|
-
models: Array<{ id: string; name?: string }>;
|
|
601
|
+
models: Array<{ id: string; name?: string | null; config?: DiscoveredModelSettings | null }>;
|
|
594
602
|
}
|
|
595
603
|
|
|
596
604
|
export interface RuntimeSettingsResponse {
|
|
@@ -672,7 +672,7 @@ dependencies = [
|
|
|
672
672
|
|
|
673
673
|
[[package]]
|
|
674
674
|
name = "crabcode-computer-use-core"
|
|
675
|
-
version = "0.1.
|
|
675
|
+
version = "0.1.8"
|
|
676
676
|
dependencies = [
|
|
677
677
|
"base64 0.22.1",
|
|
678
678
|
"core-foundation 0.10.1",
|
|
@@ -692,7 +692,7 @@ dependencies = [
|
|
|
692
692
|
|
|
693
693
|
[[package]]
|
|
694
694
|
name = "crabcode-computer-use-host"
|
|
695
|
-
version = "0.1.
|
|
695
|
+
version = "0.1.8"
|
|
696
696
|
dependencies = [
|
|
697
697
|
"cc",
|
|
698
698
|
"crabcode-computer-use-core",
|
|
@@ -709,7 +709,7 @@ dependencies = [
|
|
|
709
709
|
|
|
710
710
|
[[package]]
|
|
711
711
|
name = "crabcode-desktop"
|
|
712
|
-
version = "0.1.
|
|
712
|
+
version = "0.1.8"
|
|
713
713
|
dependencies = [
|
|
714
714
|
"base64 0.22.1",
|
|
715
715
|
"crabcode-computer-use-core",
|
|
@@ -29,6 +29,7 @@ from crabcode_gateway.schemas import (
|
|
|
29
29
|
GoalRequest,
|
|
30
30
|
GoalState,
|
|
31
31
|
ModelInfo,
|
|
32
|
+
ModelDiscoveryResponse,
|
|
32
33
|
ModelSettingsEntry,
|
|
33
34
|
ModelSettingsMutationRequest,
|
|
34
35
|
ModelSettingsResponse,
|
|
@@ -66,7 +67,7 @@ class GroupModelsRequest(BaseModel):
|
|
|
66
67
|
cwd: str | None = None
|
|
67
68
|
|
|
68
69
|
|
|
69
|
-
@router.post("/config/discover-models")
|
|
70
|
+
@router.post("/config/discover-models", response_model=ModelDiscoveryResponse, response_model_exclude_none=True)
|
|
70
71
|
async def discover_group_models(req: GroupModelsRequest, request: Request) -> dict[str, Any]:
|
|
71
72
|
from crabcode_core.api.model_discovery import ModelDiscoveryError, discover_models
|
|
72
73
|
|
|
@@ -316,7 +317,10 @@ def _redact_model_settings(value: Any, key: str = "") -> Any:
|
|
|
316
317
|
"""Keep useful configuration visible without echoing embedded credentials."""
|
|
317
318
|
normalized_key = key.lower().replace("-", "_")
|
|
318
319
|
is_reference = normalized_key.endswith("_env") or normalized_key.endswith("_path")
|
|
319
|
-
|
|
320
|
+
is_token_count = type(value) is int and normalized_key in {
|
|
321
|
+
"max_tokens", "max_output_tokens", "max_completion_tokens", "budget_tokens", "compact_buffer_tokens",
|
|
322
|
+
}
|
|
323
|
+
if key and not is_reference and not is_token_count and any(part in normalized_key for part in _SENSITIVE_CONFIG_KEYS):
|
|
320
324
|
return "[redacted]"
|
|
321
325
|
if isinstance(value, dict):
|
|
322
326
|
return {
|
|
@@ -626,11 +630,13 @@ def _mutate_model_settings(request: Request, req: ModelSettingsMutationRequest)
|
|
|
626
630
|
|
|
627
631
|
if action == "import_group_models":
|
|
628
632
|
import re
|
|
633
|
+
from crabcode_core.api.model_discovery import model_import_config
|
|
629
634
|
|
|
630
635
|
name = _validate_model_settings_name(req.name)
|
|
631
636
|
preview = _model_settings_from_files(cwd)
|
|
632
637
|
if name not in preview.groups:
|
|
633
638
|
raise HTTPException(status_code=404, detail="配置组不存在,请刷新模型目录")
|
|
639
|
+
group = ConfigManager(cwd=cwd).load().groups[name]
|
|
634
640
|
models = current.setdefault("models", {})
|
|
635
641
|
if not isinstance(models, dict):
|
|
636
642
|
raise HTTPException(status_code=422, detail="models must be a JSON object")
|
|
@@ -654,7 +660,9 @@ def _mutate_model_settings(request: Request, req: ModelSettingsMutationRequest)
|
|
|
654
660
|
tail = f" ({suffix})"
|
|
655
661
|
candidate = stem[:120 - len(tail)] + tail
|
|
656
662
|
suffix += 1
|
|
657
|
-
|
|
663
|
+
metadata = req.model_metadata.get(model_id)
|
|
664
|
+
settings = model_import_config(metadata.model_dump(exclude_none=True), group) if metadata else {}
|
|
665
|
+
models[candidate] = {"group": name, "model": model_id, **settings}
|
|
658
666
|
used_names.add(candidate)
|
|
659
667
|
elif action in {"upsert_model", "delete_model"}:
|
|
660
668
|
name = _validate_model_settings_name(req.name)
|