crabcode 0.1.8__tar.gz → 0.1.10__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.8 → crabcode-0.1.10}/.github/workflows/client-packages.yml +83 -3
- crabcode-0.1.10/CLIENT_PACKAGING.md +81 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/PKG-INFO +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/README.md +23 -3
- {crabcode-0.1.8 → crabcode-0.1.10}/README.zh-CN.md +18 -3
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_manager.py +139 -17
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/repl.py +17 -6
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/pyproject.toml +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/Cargo.lock +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/Cargo.toml +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/Cargo.toml +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/scripts/build-icons.mjs +6 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/_version.py +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/anthropic_adapter.py +48 -16
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/azure_adapter.py +3 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/base.py +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/codex_adapter.py +12 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/gemini_adapter.py +2 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_info.py +10 -0
- crabcode-0.1.10/packages/core/crabcode_core/api/network.py +145 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/ollama_adapter.py +5 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/openai_adapter.py +62 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/config/model_catalog.py +81 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/library.py +9 -3
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/claude-code.json +41 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/codex.json +47 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/cursor.json +53 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/dsh.json +101 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/kimi-code.json +59 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/opencode.json +23 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/qoder.json +185 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets/zcode.json +23 -0
- crabcode-0.1.10/packages/core/crabcode_core/prompts/presets.py +47 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/profile.py +3 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/system.py +13 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/types/config.py +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/pyproject.toml +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/pyproject.toml +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/README.md +4 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/package-lock.json +111 -5
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/package.json +2 -1
- crabcode-0.1.10/packages/desktop/src/App.startup.test.tsx +165 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/App.test.tsx +43 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/App.tsx +156 -120
- crabcode-0.1.10/packages/desktop/src/ConnectionModal.test.tsx +97 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.test.tsx +70 -6
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.tsx +10 -6
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +11 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.files.test.tsx +7 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.tsx +10 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +3 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.tsx +2 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.test.tsx +32 -3
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.tsx +21 -13
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/SettingsView.test.tsx +48 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/SettingsView.tsx +10 -7
- crabcode-0.1.10/packages/desktop/src/WindowTitlebar.css +324 -0
- crabcode-0.1.10/packages/desktop/src/WindowTitlebar.test.tsx +108 -0
- crabcode-0.1.10/packages/desktop/src/WindowTitlebar.tsx +99 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/main.tsx +1 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/platform.ts +5 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/promptTemplateFile.test.ts +17 -0
- {crabcode-0.1.8/packages/vscode → crabcode-0.1.10/packages/desktop}/src/promptTemplateFile.ts +19 -11
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/styles.css +19 -5
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/types.ts +1 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.lock +4 -3
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.toml +4 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/capabilities/default.json +4 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway.rs +66 -9
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/lib.rs +15 -0
- crabcode-0.1.10/packages/desktop/src-tauri/src/windows_python.rs +328 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/tauri.conf.json +3 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/config.py +20 -27
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/schemas.py +1 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/pyproject.toml +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/pyproject.toml +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/de.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/en.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/es.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/fr.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/ja.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/ko.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/pt-BR.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/ru.json +19 -8
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-CN.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-TW.json +18 -7
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/metadata.js +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/turnProcess.js +5 -5
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/CHANGELOG.md +16 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/README.md +15 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/README.md +3 -0
- crabcode-0.1.10/packages/vscode/computer-use/logo.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package-lock.json +2 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.json +2 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/esbuild.js +14 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package-lock.json +1300 -105
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.json +5 -1
- crabcode-0.1.10/packages/vscode/src/chat/markdown.ts +89 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/chatPanel.ts +238 -239
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/client/types.ts +1 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/connection.ts +6 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/extension.ts +7 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/gatewayManager.ts +12 -5
- {crabcode-0.1.8/packages/desktop → crabcode-0.1.10/packages/vscode}/src/promptTemplateFile.ts +19 -11
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/settings/webview.ts +18 -7
- crabcode-0.1.10/packages/vscode/src/windowsPython.ts +89 -0
- crabcode-0.1.10/packages/vscode/tests/chatMarkdown.test.cjs +117 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/computerUsePolicy.test.cjs +12 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +41 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/gatewayManager.test.cjs +36 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/helpers/chatPanelHarness.cjs +19 -5
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/imageCaptions.test.cjs +2 -1
- crabcode-0.1.10/packages/vscode/tests/sessionModel.test.cjs +96 -0
- crabcode-0.1.10/packages/vscode/tests/sessionScope.test.cjs +167 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/turnProcess.test.cjs +51 -2
- crabcode-0.1.10/packages/vscode/tests/windowsPython.test.cjs +78 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tsconfig.json +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tsconfig.webview.json +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/pyproject.toml +1 -1
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/audit_tool_cards.mjs +4 -4
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/i18n.mjs +3 -2
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/package_clients.py +14 -0
- crabcode-0.1.10/tests/test_api_parameter_forwarding.py +319 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_model_management.py +164 -3
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_client_packaging.py +20 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_model_info.py +8 -0
- crabcode-0.1.10/tests/test_openai_reasoning.py +206 -0
- crabcode-0.1.10/tests/test_prompt_presets.py +71 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_prompt_settings.py +9 -8
- crabcode-0.1.8/packages/core/crabcode_core/api/network.py +0 -69
- crabcode-0.1.8/packages/desktop/src/App.startup.test.tsx +0 -83
- {crabcode-0.1.8 → crabcode-0.1.10}/.github/actions/client-apple-signing/action.yml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/.github/workflows/computer-use.yml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/.github/workflows/document-engine-wheels.yml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/.github/workflows/python-publish.yml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/.github/workflows/windows-compat.yml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/.gitignore +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/__main__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/app.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/banner.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_picker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/pipe.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/messages.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/crabcode_cli/session_picker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/cli/hatch_build.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/Cargo.toml +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/README.md +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/build.mjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/channel.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/channel.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.d.cts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/package.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/src/channel.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/src/lib.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/build.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/src/lib.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/src/main.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/src/permission_guide.m +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/host/windows.rc +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/icons/PROMPT.md +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/icons/icon.icns +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/icons/icon.ico +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/icons/icon.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/scripts/build.mjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/scripts/check-wheel.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/computer-use/scripts/live-smoke.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/_windows_process.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/agent_manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/error_logging.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_discovery.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/api/registry.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/command_line.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/compact/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/compact/compact.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_mode.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_observation.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/config/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/config/claudemd.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/config/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/events.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/file_lock.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/filesystem.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/goal.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/image_io.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/io_worker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/logging_utils.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/client.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/client.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/config.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/path_validation.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/paths.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/peer/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/peer/runtime.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/plan/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/plan/executor.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/plan/types.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/blocks.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/context.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/templates.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/query/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/query/loop.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/query/retry.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/models.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/store.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/timing.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/session/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/session/export.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/session/meta_db.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/session/storage.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/session/title_gen.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/skills/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/skills/context.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/skills/loader.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/skills/matcher.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/subprocess_utils.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/bridge.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/inbox.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/manager.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/message_bus.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/models.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/team/recovery.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/text_io.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/agent.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/ask_user.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/bash.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/browser.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checklist.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_edit.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_read.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_write.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/glob.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/goal.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/grep.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image_generate.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/lint.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/loading.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/memory.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/monitor.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/peer.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/revert.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/schedule.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/skill.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/team.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/tool_search.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/tools/web_search.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/turn_details.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/types/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/types/event.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/types/message.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/types/tool.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/usage.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/adapters.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/dap.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/memory.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/process.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/runtime.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/sessions.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/tool.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/THEMES.md +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/index.html +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ApprovalShortcutSettings.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/CopyButton.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentViewTabs.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/ReviewMenu.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/RuntimeSettingsPanel.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/StatusBar.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/StatusBar.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.css +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/computerUse.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/computerUse.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/diffRows.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/events.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/events.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/favorites.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/favorites.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/gateway.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/gateway.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/gatewayErrors.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/i18n.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/markdownMath.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/native.lume.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/native.startup.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/native.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/native.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/pathUtils.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/permissionPresentation.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/reviewHistory.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/theme.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/theme.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/themePackages.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/themePackages.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/turnDetails.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/useGitReview.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/useGitReview.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.test.tsx +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/uuid.test.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/uuid.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/virtualMachine.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src/vite-env.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/build.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/32x32.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.icns +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.ico +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/main.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/paths.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/settings.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/tsconfig.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/desktop/vite.config.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/adapter.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/auth.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/middleware.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/protocol.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/server.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/__init__.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/background.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/chunker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/embedder.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/indexer.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/store.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/search/crabcode_search/tool.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/README.md +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/index.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/index.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/metadata.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/runtime.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/i18n/runtime.test.mjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/package.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/slashCommands.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/slashCommands.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/shared/turnProcess.d.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/.gitignore +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/.nvmrc +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/.vscode/launch.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/.vscode/tasks.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/.vscodeignore +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/LICENSE +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/.vscodeignore +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/LICENSE +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/esbuild.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/extension.js +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.de.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.es.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.fr.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ja.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ko.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.pt-br.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ru.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/logo.png +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.de.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.es.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.fr.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.ja.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.ko.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.pt-br.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.ru.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/resources/icon.svg +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/scripts/gen-types.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/client/permissionPresentation.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/client/protocol.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/computerUse.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/crabCodeSettingsPanel.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/i18n.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/ideContext.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/pendingEdits.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/runtimeControls.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/settings/catalog.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/settings/protocol.ts +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/src/settings/webview.css +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/computerUseController.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/computerUseNative.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/contextUsage.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/followUp.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/helpers/i18n.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/helpers/settingsHarness.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/i18n.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/ideContext.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/permissionPolicy.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/slashCommands.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/streamRetry.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/packages/vscode/tests/turnDetails.test.cjs +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/build_document_engine_bundle.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/prompt_budget.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/scripts/sync_version.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_api_error_logging.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_apply_patch.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_api_recovery.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_composer.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_model_picker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_session_picker.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_cli_yolo.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_codex_context_window.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_compact_prompt.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_compaction_settings.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_ax.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_history.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_observation.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_packaging.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_policy.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_computer_use_window_observations.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_config_home.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_context_token_accounting.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_follow_up_messages.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_gateway_new_session_controls.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_gateway_runtime_info.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_gateway_send_message.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_git_review.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_image_context.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_image_tool.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_io_isolation.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_model_connection.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_model_discovery.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_model_settings_delete.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_network_policy.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_openai_tool_images.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_permission_policy_status.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_project_model_catalog.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_prompt_loading.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_read_images.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_reasoning_effort.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_resume_model.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_sdk_transport_compat.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_session_storage_performance.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_stream_reconnect.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_tool_loading.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_turn_details.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_usage.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_web_search.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_windows_audit_regressions.py +0 -0
- {crabcode-0.1.8 → crabcode-0.1.10}/tests/test_windows_compat.py +0 -0
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
name: Client Packages
|
|
2
2
|
run-name: Client packages · ${{ github.ref_name }} · ${{ github.run_number }}
|
|
3
3
|
|
|
4
|
-
#
|
|
5
|
-
#
|
|
4
|
+
# Keep this filename: both registries' trusted publishers are bound to it.
|
|
5
|
+
# Manual runs build artifacts only. Releases also upload assets; stable releases
|
|
6
|
+
# publish the same VSIXs to both registries. Python/PyPI remains independent.
|
|
6
7
|
on:
|
|
7
8
|
workflow_dispatch:
|
|
9
|
+
release:
|
|
10
|
+
types: [published]
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: client-packages-${{ github.event_name }}-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: false
|
|
8
15
|
|
|
9
16
|
permissions:
|
|
10
17
|
contents: read
|
|
@@ -32,6 +39,11 @@ jobs:
|
|
|
32
39
|
python scripts/sync_version.py --check
|
|
33
40
|
python scripts/package_clients.py check
|
|
34
41
|
python packages/vscode/scripts/gen-types.py --check
|
|
42
|
+
- name: Check release tag matches client versions
|
|
43
|
+
if: github.event_name == 'release'
|
|
44
|
+
env:
|
|
45
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
46
|
+
run: python scripts/package_clients.py check --release-tag "$RELEASE_TAG"
|
|
35
47
|
- run: npm ci
|
|
36
48
|
working-directory: packages/vscode
|
|
37
49
|
- run: npm run lint
|
|
@@ -105,6 +117,8 @@ jobs:
|
|
|
105
117
|
timeout-minutes: 20
|
|
106
118
|
needs: native
|
|
107
119
|
runs-on: ubuntu-24.04
|
|
120
|
+
permissions:
|
|
121
|
+
contents: write
|
|
108
122
|
steps:
|
|
109
123
|
- uses: actions/checkout@v4
|
|
110
124
|
- uses: actions/setup-node@v4
|
|
@@ -144,7 +158,61 @@ jobs:
|
|
|
144
158
|
- name: Add download instructions
|
|
145
159
|
run: |
|
|
146
160
|
echo '## VSIX packages' >> "$GITHUB_STEP_SUMMARY"
|
|
147
|
-
echo 'Download **vsix-${{ github.run_number }}** from Artifacts and unzip it. It contains the universal CrabCode main extension, three platform Computer Use companions, the all-platform companion, and SHA256SUMS.
|
|
161
|
+
echo 'Download **vsix-${{ github.run_number }}** from Artifacts and unzip it. It contains the universal CrabCode main extension, three platform Computer Use companions, the all-platform companion, and SHA256SUMS. Release runs also attach these VSIXs to the release; stable releases publish them to both extension stores.' >> "$GITHUB_STEP_SUMMARY"
|
|
162
|
+
- name: Upload VSIXs to GitHub Release
|
|
163
|
+
if: github.event_name == 'release'
|
|
164
|
+
working-directory: dist/vsix
|
|
165
|
+
env:
|
|
166
|
+
GH_TOKEN: ${{ github.token }}
|
|
167
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
168
|
+
run: |
|
|
169
|
+
cp SHA256SUMS vsix-SHA256SUMS
|
|
170
|
+
gh release upload "$RELEASE_TAG" ./*.vsix vsix-SHA256SUMS --repo "$GITHUB_REPOSITORY" --clobber
|
|
171
|
+
|
|
172
|
+
publish-extensions:
|
|
173
|
+
name: Publish VSIXs · ${{ matrix.registry }}
|
|
174
|
+
if: github.event_name == 'release' && !github.event.release.prerelease
|
|
175
|
+
needs: vsix
|
|
176
|
+
timeout-minutes: 30
|
|
177
|
+
runs-on: ubuntu-24.04
|
|
178
|
+
permissions:
|
|
179
|
+
contents: read
|
|
180
|
+
id-token: write
|
|
181
|
+
strategy:
|
|
182
|
+
fail-fast: false
|
|
183
|
+
matrix:
|
|
184
|
+
registry: [marketplace, open-vsx]
|
|
185
|
+
steps:
|
|
186
|
+
- uses: actions/setup-node@v4
|
|
187
|
+
with:
|
|
188
|
+
node-version: '22'
|
|
189
|
+
- uses: actions/download-artifact@v4
|
|
190
|
+
with:
|
|
191
|
+
name: vsix-${{ github.run_number }}
|
|
192
|
+
path: dist/vsix
|
|
193
|
+
- name: Verify downloaded VSIX checksums
|
|
194
|
+
working-directory: dist/vsix
|
|
195
|
+
run: sha256sum --check SHA256SUMS
|
|
196
|
+
- name: Install Marketplace publisher with OIDC support
|
|
197
|
+
if: matrix.registry == 'marketplace'
|
|
198
|
+
run: npm install --global @vscode/vsce@4.1.0
|
|
199
|
+
- name: Install Open VSX publisher with OIDC support
|
|
200
|
+
if: matrix.registry == 'open-vsx'
|
|
201
|
+
run: npm install --global ovsx@1.3.0
|
|
202
|
+
# Publish prebuilt packages without rerunning vscode:prepublish. Each call
|
|
203
|
+
# obtains its own short-lived credential. Duplicates are safe to retry.
|
|
204
|
+
- name: Publish all VSIXs to Visual Studio Marketplace
|
|
205
|
+
if: matrix.registry == 'marketplace'
|
|
206
|
+
run: |
|
|
207
|
+
for package in dist/vsix/*.vsix; do
|
|
208
|
+
vsce publish --packagePath "$package" --oidc --skip-duplicate
|
|
209
|
+
done
|
|
210
|
+
- name: Publish all VSIXs to Open VSX
|
|
211
|
+
if: matrix.registry == 'open-vsx'
|
|
212
|
+
run: |
|
|
213
|
+
for package in dist/vsix/*.vsix; do
|
|
214
|
+
ovsx publish "$package" --trusted-publishing --skip-duplicate
|
|
215
|
+
done
|
|
148
216
|
|
|
149
217
|
desktop:
|
|
150
218
|
name: Desktop installer · ${{ matrix.platform }}
|
|
@@ -161,6 +229,8 @@ jobs:
|
|
|
161
229
|
- platform: win32-x64
|
|
162
230
|
os: windows-2022
|
|
163
231
|
runs-on: ${{ matrix.os }}
|
|
232
|
+
permissions:
|
|
233
|
+
contents: write
|
|
164
234
|
env:
|
|
165
235
|
MACOSX_DEPLOYMENT_TARGET: '11.0'
|
|
166
236
|
steps:
|
|
@@ -212,3 +282,13 @@ jobs:
|
|
|
212
282
|
run: |
|
|
213
283
|
echo '## Desktop installer' >> "$GITHUB_STEP_SUMMARY"
|
|
214
284
|
echo 'Download **desktop-${{ matrix.platform }}-${{ github.run_number }}** from Artifacts. It contains the DMG or MSI and SHA256SUMS.' >> "$GITHUB_STEP_SUMMARY"
|
|
285
|
+
- name: Upload Desktop installer to GitHub Release
|
|
286
|
+
if: github.event_name == 'release'
|
|
287
|
+
shell: bash
|
|
288
|
+
working-directory: dist/desktop
|
|
289
|
+
env:
|
|
290
|
+
GH_TOKEN: ${{ github.token }}
|
|
291
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
292
|
+
run: |
|
|
293
|
+
cp SHA256SUMS desktop-${{ matrix.platform }}-SHA256SUMS
|
|
294
|
+
gh release upload "$RELEASE_TAG" ./crab-desktop-* desktop-${{ matrix.platform }}-SHA256SUMS --repo "$GITHUB_REPOSITORY" --clobber
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Client packaging and releases
|
|
2
|
+
|
|
3
|
+
`.github/workflows/client-packages.yml` builds the VS Code extensions and Desktop
|
|
4
|
+
installers from the same commit. It builds Computer Use once on each native
|
|
5
|
+
runner, then reuses those bundles for the extensions and installers.
|
|
6
|
+
|
|
7
|
+
| Trigger | Actions artifacts | GitHub Release assets | Extension stores |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Actions → Client Packages → Run workflow | Yes | No | No |
|
|
10
|
+
| Publish a stable GitHub Release | Yes | Yes | Marketplace and Open VSX |
|
|
11
|
+
| Publish a prerelease on GitHub | Yes | Yes | No |
|
|
12
|
+
|
|
13
|
+
The workflow must be committed before creating the release tag. The tag must be
|
|
14
|
+
the version in the checked-out client manifests, with an optional `v` prefix
|
|
15
|
+
(for example, `0.1.10` or `v0.1.10`). Version mismatches fail before native builds.
|
|
16
|
+
Use a new version when changing published packages; existing registry versions
|
|
17
|
+
are not replaced. The independent `python-publish.yml` workflow continues to
|
|
18
|
+
handle Python/PyPI publishing.
|
|
19
|
+
|
|
20
|
+
## Release downloads
|
|
21
|
+
|
|
22
|
+
For version `<version>`, the release receives:
|
|
23
|
+
|
|
24
|
+
- `crabcode-<version>.vsix`: universal main extension.
|
|
25
|
+
- `crabcode-computer-use-<version>-darwin-arm64.vsix`.
|
|
26
|
+
- `crabcode-computer-use-<version>-darwin-x64.vsix`.
|
|
27
|
+
- `crabcode-computer-use-<version>-win32-x64.vsix`.
|
|
28
|
+
- `crabcode-computer-use-<version>-universal.vsix`: all three native bundles.
|
|
29
|
+
- `crab-desktop-<version>-darwin-arm64.dmg`: Apple Silicon Mac.
|
|
30
|
+
- `crab-desktop-<version>-darwin-x64.dmg`: Intel Mac.
|
|
31
|
+
- `crab-desktop-<version>-win32-x64.msi`: Windows x64.
|
|
32
|
+
|
|
33
|
+
The VSIXs share `vsix-SHA256SUMS`. Each Desktop installer has its own
|
|
34
|
+
`desktop-<platform>-SHA256SUMS`, so concurrently finishing jobs cannot overwrite
|
|
35
|
+
each other's checksums. Each build uploads its own release assets immediately;
|
|
36
|
+
Desktop uploads do not depend on extension-store publication.
|
|
37
|
+
|
|
38
|
+
Actions retains the packaged downloads for 30 days and intermediate native
|
|
39
|
+
bundles for 7 days. Release attachments remain available independently of those
|
|
40
|
+
artifact retention periods. Rerunning a release job replaces its same-named
|
|
41
|
+
GitHub attachments. Registry publishing skips versions already present, and
|
|
42
|
+
the two stores run independently so a failure in one does not cancel the other.
|
|
43
|
+
|
|
44
|
+
## Trusted publishing
|
|
45
|
+
|
|
46
|
+
Both registries must authorize repository owner `ylzz1997`, repository `crabcode`,
|
|
47
|
+
workflow **`client-packages.yml`**, with **no environment restriction**. Keep the
|
|
48
|
+
workflow filename unchanged unless the policies are also updated.
|
|
49
|
+
|
|
50
|
+
- Visual Studio Marketplace: create a Trusted Publishing policy under publisher
|
|
51
|
+
`crabcode`.
|
|
52
|
+
- Open VSX: configure a trusted publisher for each extension, `crabcode` and
|
|
53
|
+
`crabcode-computer-use`, in namespace `crabcode`.
|
|
54
|
+
|
|
55
|
+
Only the publishing job requests `id-token: write`. It uses Node 22,
|
|
56
|
+
`@vscode/vsce@4.1.0` with `--oidc`, and `ovsx@1.3.0` with
|
|
57
|
+
`--trusted-publishing`. It verifies artifact SHA256 checksums and publishes the
|
|
58
|
+
already-built VSIXs, without rerunning native build or prepublish hooks. No
|
|
59
|
+
`VSCE_PAT` or `OVSX_PAT` secret is required. Release uploads use GitHub's built-in
|
|
60
|
+
token with `contents: write` in the corresponding build jobs.
|
|
61
|
+
|
|
62
|
+
See the [Marketplace documentation](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#publish-with-github-actions-and-trusted-publishing)
|
|
63
|
+
and [Open VSX CLI documentation](https://github.com/eclipse-openvsx/openvsx/blob/main/cli/README.md#trusted-publishing).
|
|
64
|
+
|
|
65
|
+
## Verification and signing
|
|
66
|
+
|
|
67
|
+
The workflow checks synchronized versions, extension icons, client tests,
|
|
68
|
+
Computer Use tests, native architectures and runtime metadata. It inspects the
|
|
69
|
+
packaged VSIX payloads, executable permissions, localization and icon bytes.
|
|
70
|
+
Desktop checks inspect the actual DMG/MSI contents on their native OS runners.
|
|
71
|
+
The companion's `logo.png` is a 512-pixel rendition of the native Computer Use
|
|
72
|
+
icon; `node packages/computer-use/scripts/build-icons.mjs` regenerates it alongside
|
|
73
|
+
the native icons on macOS.
|
|
74
|
+
|
|
75
|
+
Optional macOS signing secrets are `CRABCODE_SIGNING_CERTIFICATE_P12_BASE64`,
|
|
76
|
+
`CRABCODE_SIGNING_CERTIFICATE_PASSWORD`, and `CRABCODE_SIGNING_IDENTITY`.
|
|
77
|
+
Without them, macOS builds use ad-hoc signing. The workflow does not notarize
|
|
78
|
+
macOS installers or Authenticode-sign Windows installers.
|
|
79
|
+
|
|
80
|
+
A successful upload is submission evidence. Check Marketplace verification
|
|
81
|
+
status and Open VSX public availability separately after the first release run.
|
|
@@ -322,6 +322,18 @@ plans, diffs, and checkpoint recovery. Tauri additionally provides system
|
|
|
322
322
|
credential storage and automatic local Gateway startup; browser mode connects
|
|
323
323
|
to an already-running Gateway and retains passwords only for the current tab.
|
|
324
324
|
|
|
325
|
+
Local Desktop startup requires Python 3.10–3.14 (the current Gateway dependencies
|
|
326
|
+
do not support Python 3.15). On Windows, Desktop checks
|
|
327
|
+
the configured Python path and PATH commands, then registered Python installations,
|
|
328
|
+
uv (including `UV_PYTHON_INSTALL_DIR`), standard installation folders, and common
|
|
329
|
+
Conda locations. Python does not need to be on PATH; Microsoft Store placeholders
|
|
330
|
+
and unusable interpreters are skipped. You can also set an executable explicitly
|
|
331
|
+
under **Settings → General → Python path**. Desktop installs its backend into a
|
|
332
|
+
separate environment when needed; it does not install Python itself.
|
|
333
|
+
The VS Code extension uses the same additional Windows discovery sources after
|
|
334
|
+
checking its configured interpreter, Python extension, workspace `.venv`, Conda,
|
|
335
|
+
and PATH. Set `crabcode.pythonPath` to select a particular installation.
|
|
336
|
+
|
|
325
337
|
Downloadable Desktop DMG/MSI installers and platform/universal VSIXs are built
|
|
326
338
|
through **Actions → Client Packages → Run workflow**. See
|
|
327
339
|
[manual client packaging](CLIENT_PACKAGING.md) for downloads and signing.
|
|
@@ -580,7 +592,7 @@ For DeepSeek V4 thinking mode with tool calls, enable reasoning pass-through:
|
|
|
580
592
|
|
|
581
593
|
CrabCode automatically manages the context window to prevent `400 token limit exceeded` errors.
|
|
582
594
|
|
|
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.
|
|
595
|
+
When importing new models with **Get model list** on a configuration group in Desktop or VS Code, or with `/add discover` in the CLI, 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
596
|
|
|
585
597
|
**How context window size is resolved** (in priority order):
|
|
586
598
|
|
|
@@ -766,8 +778,9 @@ crabcode --model-profile smart # short: -M smart
|
|
|
766
778
|
/model fast # switch to the "fast" (ollama) profile
|
|
767
779
|
/model smart # switch to the "smart" (anthropic) profile
|
|
768
780
|
/model code # switch to the "code" (openai) profile
|
|
769
|
-
/add # guided menu: add a model or
|
|
781
|
+
/add # guided menu: add a model/group or fetch models from a group
|
|
770
782
|
/add model # open the add-model wizard directly
|
|
783
|
+
/add discover # fetch and batch-import models from an existing group
|
|
771
784
|
/del group # choose and delete a group definition
|
|
772
785
|
```
|
|
773
786
|
|
|
@@ -775,6 +788,13 @@ Switching does not clear conversation history — you can mix models freely with
|
|
|
775
788
|
The `/add` and `/del` wizards let you choose user, shared-project, or local-project
|
|
776
789
|
settings. Delete targets show their exact source layer; the active model (or its
|
|
777
790
|
group) is protected until you switch away from it.
|
|
791
|
+
Use `/add discover` (or **Get models from group** in `/add`) to fetch the same
|
|
792
|
+
model list available in Desktop. Choose a saved group, type to search, use
|
|
793
|
+
Space/Tab to toggle models and Ctrl+A to toggle all search results, then press
|
|
794
|
+
Enter to choose the destination settings layer and confirm the import. Each batch
|
|
795
|
+
supports up to 1000 models. Existing models and defaults are preserved; new
|
|
796
|
+
profiles inherit the group's connection settings and use API-provided metadata
|
|
797
|
+
for context, output and thinking limits. Use `/model` to switch after importing.
|
|
778
798
|
|
|
779
799
|
## Built-in Tools
|
|
780
800
|
|
|
@@ -1156,7 +1176,7 @@ never modified by either client.
|
|
|
1156
1176
|
| `/logs --clear <name>` | Clear a specific log file |
|
|
1157
1177
|
| `/model` | Open a searchable model picker organized by group; ↑/↓ select, Enter switches, Esc cancels, Tab and ←/→ filter groups |
|
|
1158
1178
|
| `/model <name>` | Switch to a named model from `settings.models` |
|
|
1159
|
-
| `/add [model\|group]` | Add a
|
|
1179
|
+
| `/add [model\|group\|discover]` | Add a model/group or fetch, select and batch-import models from an existing group |
|
|
1160
1180
|
| `/del [model\|group]` | Delete a model or group from a selected writable settings layer |
|
|
1161
1181
|
| `/effort` | Show the active reasoning effort |
|
|
1162
1182
|
| `/effort <none\|minimal\|low\|medium\|high\|xhigh\|max>` | Set reasoning effort for subsequent requests in the current runtime session |
|
|
@@ -319,6 +319,15 @@ Gateway 允许工作区内的 `cwd`。
|
|
|
319
319
|
Tauri 额外提供系统凭据库与本地 Gateway 自动启动;浏览器版连接已经运行的
|
|
320
320
|
Gateway,密码只保留在当前浏览器标签页中。
|
|
321
321
|
|
|
322
|
+
Desktop 启动本地服务需要 Python 3.10–3.14(当前网关依赖尚不支持 Python 3.15)。
|
|
323
|
+
Windows 版会依次检查指定的
|
|
324
|
+
Python 路径、PATH 命令、注册表中的 Python、uv(包括 `UV_PYTHON_INSTALL_DIR`)、
|
|
325
|
+
常见安装目录和 Conda 目录。Python 不必加入 PATH;商店占位程序和无法运行的
|
|
326
|
+
解释器会被跳过。也可以在**设置 → 常规 → Python 路径**中手动指定可执行文件。
|
|
327
|
+
需要时 Desktop 会在独立环境中安装后端依赖,但不会自动安装 Python 本身。
|
|
328
|
+
VS Code 扩展在指定解释器、Python 扩展、工作区 `.venv`、Conda 和 PATH 都不可用时,
|
|
329
|
+
也会搜索上述 Windows 安装位置;可通过 `crabcode.pythonPath` 指定要使用的解释器。
|
|
330
|
+
|
|
322
331
|
Desktop 和 VS Code 扩展中的每条已完成助手回复都可以分叉到新会话。新会话会
|
|
323
332
|
立即打开,保留该回复之前的对话,并显示来源会话/标题;运行中的轮次、待处理的
|
|
324
333
|
工具、权限请求和 WebSocket 运行态不会被复制。VS Code 聊天里的复制按钮默认隐藏,
|
|
@@ -569,7 +578,7 @@ DeepSeek V4 思考模式配合工具调用时,需要开启 reasoning 回传:
|
|
|
569
578
|
|
|
570
579
|
CrabCode 会自动管理上下文窗口,防止因 token 超限导致 `400` 报错。
|
|
571
580
|
|
|
572
|
-
在 Desktop 或 VS Code
|
|
581
|
+
在 Desktop 或 VS Code 的模型设置中从配置组「获取模型列表」,或在 CLI 中使用 `/add discover` 导入新模型时,会自动保存 `/models` 返回的上下文窗口和最大输出 token 数。支持 Anthropic 的 `max_input_tokens` / `max_tokens`、OpenRouter 的 `context_length` / `top_provider.max_completion_tokens`,以及兼容接口的常见限制字段;有多项限制时取较小值。接口明确提供思考能力时会设置思考开关,Anthropic 的思考预算也会限制在输出上限以内。配置组中手动指定的上下文窗口、较小的输出预算和关闭思考的偏好会保留;已有模型不会被覆盖,接口未提供的字段继续继承配置或使用运行时默认值。温度、思考强度、价格和图像/工具能力不会根据模型名称推测或自动改写。
|
|
573
582
|
|
|
574
583
|
**上下文窗口大小的解析优先级:**
|
|
575
584
|
|
|
@@ -749,14 +758,20 @@ crabcode --model-profile smart # 简写:-M smart
|
|
|
749
758
|
/model # 打开模型选择页,搜索并切换已配置的模型
|
|
750
759
|
/model fast # 切换到 "fast" 模型
|
|
751
760
|
/model local # 切换到 "local"(如 Ollama 本地模型)
|
|
752
|
-
/add #
|
|
761
|
+
/add # 进入引导菜单,添加模型/group 或从 group 获取模型
|
|
753
762
|
/add model # 直接进入添加模型向导
|
|
763
|
+
/add discover # 从已有 group 获取模型列表并批量导入
|
|
754
764
|
/del group # 选择并删除一个 group 定义
|
|
755
765
|
```
|
|
756
766
|
|
|
757
767
|
切换模型不会清空对话历史,可以在同一会话中混用不同模型。
|
|
758
768
|
`/add` 与 `/del` 向导可选择用户级、项目共享或项目本地配置层;删除列表会
|
|
759
769
|
明确显示定义所在层。当前正在使用的模型及其 group 需先切换后才能删除。
|
|
770
|
+
使用 `/add discover`(或 `/add` 菜单中的 **Get models from group**)可获取与
|
|
771
|
+
Desktop 相同的模型列表。选定已有 group 后,输入文字搜索,按空格或 Tab 勾选,
|
|
772
|
+
Ctrl+A 全选/取消当前搜索结果,再按 Enter 选择保存层并确认导入;每批最多 1000 个。
|
|
773
|
+
已有模型和默认模型保持不变,新模型继承 group 的连接配置,并应用接口提供的
|
|
774
|
+
上下文、输出和思考限制。导入后可用 `/model` 切换。
|
|
760
775
|
|
|
761
776
|
## 内置工具
|
|
762
777
|
|
|
@@ -1141,7 +1156,7 @@ Desktop 的“设置 → 运行与工具”可以直接编辑这些字段,也
|
|
|
1141
1156
|
| `/logs --clear <名称>` | 清空指定日志文件 |
|
|
1142
1157
|
| `/model` | 打开按分组展示、可搜索的模型选择页;↑/↓ 选择、Enter 切换、Esc 返回,Tab 与 ←/→ 筛选分组 |
|
|
1143
1158
|
| `/model <名称>` | 切换到 `settings.models` 中的命名模型 |
|
|
1144
|
-
| `/add [model\|group]` |
|
|
1159
|
+
| `/add [model\|group\|discover]` | 添加模型/group,或从已有 group 获取、选择并批量导入模型 |
|
|
1145
1160
|
| `/del [model\|group]` | 从指定的可写配置层删除模型或 group |
|
|
1146
1161
|
| `/effort` | 查看当前 reasoning effort |
|
|
1147
1162
|
| `/effort <none\|minimal\|low\|medium\|high\|xhigh\|max>` | 设置当前运行会话后续请求的 reasoning effort |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Guided terminal menus for adding and deleting
|
|
1
|
+
"""Guided terminal menus for adding, discovering and deleting models."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -16,17 +16,20 @@ from prompt_toolkit.layout import HSplit, Layout, VSplit, Window
|
|
|
16
16
|
from prompt_toolkit.layout.controls import BufferControl, FormattedTextControl
|
|
17
17
|
|
|
18
18
|
from crabcode_cli.session_picker import PICKER_STYLE, _plain
|
|
19
|
+
from crabcode_core.api.model_discovery import ModelDiscoveryError, discover_models
|
|
19
20
|
from crabcode_core.config.manager import ConfigManager
|
|
20
21
|
from crabcode_core.config.model_catalog import (
|
|
21
22
|
SETTINGS_SOURCE_LABELS,
|
|
22
23
|
WRITABLE_SETTINGS_SOURCES,
|
|
23
24
|
CatalogKind,
|
|
25
|
+
CatalogImportResult,
|
|
24
26
|
CatalogMutationResult,
|
|
25
27
|
ModelCatalogError,
|
|
26
28
|
WritableSettingsSource,
|
|
27
29
|
add_catalog_entry,
|
|
28
30
|
catalog_names,
|
|
29
31
|
delete_catalog_entry,
|
|
32
|
+
import_group_models,
|
|
30
33
|
list_catalog_definitions,
|
|
31
34
|
referencing_models,
|
|
32
35
|
settings_source_path,
|
|
@@ -36,6 +39,7 @@ from crabcode_core.events import CoreSession
|
|
|
36
39
|
|
|
37
40
|
|
|
38
41
|
ManagementAction = Literal["add", "delete"]
|
|
42
|
+
ManagementKind = Literal["model", "group", "discover"]
|
|
39
43
|
|
|
40
44
|
_SENSITIVE_CONFIG_KEYS = (
|
|
41
45
|
"api_key",
|
|
@@ -53,6 +57,7 @@ class MenuOption:
|
|
|
53
57
|
value: str
|
|
54
58
|
label: str
|
|
55
59
|
hint: str = ""
|
|
60
|
+
disabled: bool = False
|
|
56
61
|
|
|
57
62
|
|
|
58
63
|
class Prompter(Protocol):
|
|
@@ -65,6 +70,10 @@ class Prompter(Protocol):
|
|
|
65
70
|
initial: str | None = None,
|
|
66
71
|
) -> str | None: ...
|
|
67
72
|
|
|
73
|
+
async def multiselect(
|
|
74
|
+
self, message: str, options: Sequence[MenuOption],
|
|
75
|
+
) -> list[str] | None: ...
|
|
76
|
+
|
|
68
77
|
async def text(self, message: str, *, initial: str = "") -> str | None: ...
|
|
69
78
|
|
|
70
79
|
async def confirm(self, message: str, *, default: bool = False) -> bool | None: ...
|
|
@@ -85,12 +94,16 @@ class SearchableMenu:
|
|
|
85
94
|
*,
|
|
86
95
|
searchable: bool = True,
|
|
87
96
|
initial: str | None = None,
|
|
97
|
+
multiple: bool = False,
|
|
88
98
|
) -> None:
|
|
89
99
|
self.title = title
|
|
90
100
|
self.message = message
|
|
91
101
|
self.options = list(options)
|
|
92
102
|
self.searchable = searchable
|
|
93
103
|
self.initial = initial
|
|
104
|
+
self.multiple = multiple
|
|
105
|
+
self.checked: set[str] = set()
|
|
106
|
+
self.selection_error = ""
|
|
94
107
|
self.matches = self.options.copy()
|
|
95
108
|
self.selected = next(
|
|
96
109
|
(index for index, option in enumerate(self.matches) if option.value == initial),
|
|
@@ -118,9 +131,39 @@ class SearchableMenu:
|
|
|
118
131
|
|
|
119
132
|
@bindings.add("enter", eager=True)
|
|
120
133
|
def confirm(event: Any) -> None:
|
|
121
|
-
if self.
|
|
134
|
+
if self.multiple:
|
|
135
|
+
if self.checked:
|
|
136
|
+
event.app.exit(result=[option.value for option in self.options if option.value in self.checked])
|
|
137
|
+
elif self.matches:
|
|
122
138
|
event.app.exit(result=self.matches[self.selected].value)
|
|
123
139
|
|
|
140
|
+
if multiple:
|
|
141
|
+
@bindings.add("tab", eager=True)
|
|
142
|
+
@bindings.add(" ", eager=True)
|
|
143
|
+
def toggle(event: Any) -> None:
|
|
144
|
+
if self.matches:
|
|
145
|
+
option = self.matches[self.selected]
|
|
146
|
+
if option.disabled:
|
|
147
|
+
return
|
|
148
|
+
self.selection_error = ""
|
|
149
|
+
if option.value in self.checked:
|
|
150
|
+
self.checked.remove(option.value)
|
|
151
|
+
elif len(self.checked) < 1000:
|
|
152
|
+
self.checked.add(option.value)
|
|
153
|
+
else:
|
|
154
|
+
self.selection_error = "Select at most 1000 models per import."
|
|
155
|
+
|
|
156
|
+
@bindings.add("c-a", eager=True)
|
|
157
|
+
def toggle_visible(event: Any) -> None:
|
|
158
|
+
visible = {option.value for option in self.matches if not option.disabled}
|
|
159
|
+
self.selection_error = ""
|
|
160
|
+
if visible <= self.checked:
|
|
161
|
+
self.checked.difference_update(visible)
|
|
162
|
+
elif len(self.checked | visible) <= 1000:
|
|
163
|
+
self.checked.update(visible)
|
|
164
|
+
else:
|
|
165
|
+
self.selection_error = "Select at most 1000 models; narrow the search first."
|
|
166
|
+
|
|
124
167
|
@bindings.add("up")
|
|
125
168
|
@bindings.add("down")
|
|
126
169
|
@bindings.add("pageup")
|
|
@@ -172,11 +215,11 @@ class SearchableMenu:
|
|
|
172
215
|
self.list_window,
|
|
173
216
|
Window(FormattedTextControl(self._details), height=2, wrap_lines=True),
|
|
174
217
|
Window(char="─", height=1, style="class:hint"),
|
|
175
|
-
Window(FormattedTextControl(self._footer), height=2, wrap_lines=True),
|
|
218
|
+
Window(FormattedTextControl(self._footer), height=3 if multiple else 2, wrap_lines=True),
|
|
176
219
|
]
|
|
177
220
|
)
|
|
178
221
|
focused = self.search if searchable else self.list_control
|
|
179
|
-
self.app: Application[str | None] = Application(
|
|
222
|
+
self.app: Application[str | list[str] | None] = Application(
|
|
180
223
|
layout=Layout(HSplit(content), focused_element=focused),
|
|
181
224
|
key_bindings=bindings,
|
|
182
225
|
full_screen=True,
|
|
@@ -218,10 +261,13 @@ class SearchableMenu:
|
|
|
218
261
|
fragments: list[tuple[str, str]] = []
|
|
219
262
|
for index, option in enumerate(self.matches):
|
|
220
263
|
style = "class:selected" if index == self.selected else ""
|
|
264
|
+
marker = ""
|
|
265
|
+
if self.multiple:
|
|
266
|
+
marker = "[✓] " if option.disabled else "[x] " if option.value in self.checked else "[ ] "
|
|
221
267
|
fragments.extend(
|
|
222
268
|
[
|
|
223
269
|
(style, " ❯ " if index == self.selected else " "),
|
|
224
|
-
(style, _plain(option.label)),
|
|
270
|
+
(style, marker + _plain(option.label)),
|
|
225
271
|
("", "\n" if index < len(self.matches) - 1 else ""),
|
|
226
272
|
]
|
|
227
273
|
)
|
|
@@ -237,6 +283,12 @@ class SearchableMenu:
|
|
|
237
283
|
|
|
238
284
|
def _footer(self) -> list[tuple[str, str]]:
|
|
239
285
|
count = len(self.matches)
|
|
286
|
+
if self.multiple:
|
|
287
|
+
return [("class:hint",
|
|
288
|
+
" ↑↓ browse · Space/Tab toggle · Enter import · Esc cancel\n"
|
|
289
|
+
" Ctrl+A toggle results · Type to search · Ctrl+U clear\n"
|
|
290
|
+
f" {self.selection_error or f'{len(self.checked)} selected · {count} shown'}"
|
|
291
|
+
)]
|
|
240
292
|
search_help = " · Type to search" if self.searchable else ""
|
|
241
293
|
return [
|
|
242
294
|
(
|
|
@@ -246,7 +298,7 @@ class SearchableMenu:
|
|
|
246
298
|
)
|
|
247
299
|
]
|
|
248
300
|
|
|
249
|
-
async def run(self) -> str | None:
|
|
301
|
+
async def run(self) -> str | list[str] | None:
|
|
250
302
|
if not self.options:
|
|
251
303
|
return None
|
|
252
304
|
return await self.app.run_async()
|
|
@@ -264,13 +316,22 @@ class TerminalPrompter:
|
|
|
264
316
|
searchable: bool = True,
|
|
265
317
|
initial: str | None = None,
|
|
266
318
|
) -> str | None:
|
|
267
|
-
|
|
319
|
+
result = await SearchableMenu(
|
|
268
320
|
"Model management",
|
|
269
321
|
message,
|
|
270
322
|
options,
|
|
271
323
|
searchable=searchable,
|
|
272
324
|
initial=initial,
|
|
273
325
|
).run()
|
|
326
|
+
return cast(str | None, result)
|
|
327
|
+
|
|
328
|
+
async def multiselect(
|
|
329
|
+
self, message: str, options: Sequence[MenuOption],
|
|
330
|
+
) -> list[str] | None:
|
|
331
|
+
result = await SearchableMenu(
|
|
332
|
+
"Get models from group", message, options, multiple=True,
|
|
333
|
+
).run()
|
|
334
|
+
return cast(list[str] | None, result)
|
|
274
335
|
|
|
275
336
|
async def text(self, message: str, *, initial: str = "") -> str | None:
|
|
276
337
|
prompt: PromptSession[str] = PromptSession()
|
|
@@ -337,17 +398,21 @@ _FORMATS: tuple[MenuOption, ...] = tuple(
|
|
|
337
398
|
async def manage_model_catalog(
|
|
338
399
|
session: CoreSession,
|
|
339
400
|
action: ManagementAction,
|
|
340
|
-
kind:
|
|
401
|
+
kind: ManagementKind | None = None,
|
|
341
402
|
*,
|
|
342
403
|
prompter: Prompter | None = None,
|
|
343
|
-
) -> CatalogMutationResult | None:
|
|
344
|
-
"""Run the guided
|
|
404
|
+
) -> CatalogMutationResult | CatalogImportResult | None:
|
|
405
|
+
"""Run the guided management flow and refresh the current session catalog."""
|
|
345
406
|
active_prompter = prompter or TerminalPrompter()
|
|
346
407
|
try:
|
|
347
408
|
selected_kind = kind or await _choose_kind(action, active_prompter)
|
|
348
409
|
if selected_kind is None:
|
|
349
410
|
return None
|
|
350
|
-
if
|
|
411
|
+
if selected_kind == "discover":
|
|
412
|
+
if action != "add":
|
|
413
|
+
raise ModelCatalogError("Use /add discover to fetch models from a group.")
|
|
414
|
+
result = await _discover_group_models(session, active_prompter)
|
|
415
|
+
elif action == "add":
|
|
351
416
|
result = await _add_entry(session, selected_kind, active_prompter)
|
|
352
417
|
else:
|
|
353
418
|
result = await _delete_entry(session, selected_kind, active_prompter)
|
|
@@ -358,17 +423,74 @@ async def manage_model_catalog(
|
|
|
358
423
|
return None
|
|
359
424
|
|
|
360
425
|
|
|
361
|
-
async def _choose_kind(action: ManagementAction, prompter: Prompter) ->
|
|
426
|
+
async def _choose_kind(action: ManagementAction, prompter: Prompter) -> ManagementKind | None:
|
|
427
|
+
options = [
|
|
428
|
+
MenuOption("model", "Model", "A named model profile shown by /model"),
|
|
429
|
+
MenuOption("group", "Group", "Shared provider and API settings inherited by models"),
|
|
430
|
+
]
|
|
431
|
+
if action == "add":
|
|
432
|
+
options.append(MenuOption("discover", "Get models from group", "Fetch, search and import models using a saved group"))
|
|
362
433
|
value = await prompter.select(
|
|
363
434
|
"What do you want to add?" if action == "add" else "What do you want to delete?",
|
|
364
|
-
|
|
365
|
-
MenuOption("model", "Model", "A named model profile shown by /model"),
|
|
366
|
-
MenuOption("group", "Group", "Shared provider and API settings inherited by models"),
|
|
367
|
-
),
|
|
435
|
+
options,
|
|
368
436
|
searchable=False,
|
|
369
437
|
initial="model",
|
|
370
438
|
)
|
|
371
|
-
return cast(
|
|
439
|
+
return cast(ManagementKind | None, value)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
async def _discover_group_models(
|
|
443
|
+
session: CoreSession, prompter: Prompter,
|
|
444
|
+
) -> CatalogImportResult | None:
|
|
445
|
+
settings = ConfigManager(cwd=session.cwd).load()
|
|
446
|
+
if not settings.groups:
|
|
447
|
+
raise ModelCatalogError("No configuration groups found. Create one with /add group first.")
|
|
448
|
+
name = await prompter.select(
|
|
449
|
+
"Select a group to fetch models from",
|
|
450
|
+
[MenuOption(name, name, _config_hint(group.model_dump(exclude_none=True)))
|
|
451
|
+
for name, group in settings.groups.items()],
|
|
452
|
+
)
|
|
453
|
+
if name is None:
|
|
454
|
+
return None
|
|
455
|
+
prompter.note("Fetching model list", f"Group: {_plain(name)} · timeout: 15 seconds")
|
|
456
|
+
try:
|
|
457
|
+
models = await discover_models(settings.groups[name], settings.env)
|
|
458
|
+
except ModelDiscoveryError as exc:
|
|
459
|
+
raise ModelCatalogError(str(exc)) from None
|
|
460
|
+
existing_ids = {config.model for config in settings.models.values() if config.group == name}
|
|
461
|
+
available = [model for model in models if model["id"] not in existing_ids]
|
|
462
|
+
if not available:
|
|
463
|
+
prompter.note("Model list", "All returned models are already in this group." if models else "The API returned no models.")
|
|
464
|
+
return None
|
|
465
|
+
options = []
|
|
466
|
+
for model in models:
|
|
467
|
+
existing = model["id"] in existing_ids
|
|
468
|
+
metadata = model.get("config", {})
|
|
469
|
+
hints = [model.get("name", "")]
|
|
470
|
+
hints.extend(f"{key}: {value}" for key, value in metadata.items())
|
|
471
|
+
options.append(MenuOption(
|
|
472
|
+
model["id"], model["id"] + (" · already added" if existing else ""),
|
|
473
|
+
" · ".join(hint for hint in hints if hint), disabled=existing,
|
|
474
|
+
))
|
|
475
|
+
selected = await prompter.multiselect(f"Group: {name} · select models to import", options)
|
|
476
|
+
if not selected:
|
|
477
|
+
return None
|
|
478
|
+
selected_ids = set(selected)
|
|
479
|
+
if not selected_ids <= {model["id"] for model in available}:
|
|
480
|
+
raise ModelCatalogError("Select only available models from the fetched list.")
|
|
481
|
+
source = await _choose_source(session.cwd, prompter)
|
|
482
|
+
preview = "\n".join(_plain(model_id) for model_id in selected[:20])
|
|
483
|
+
if len(selected) > 20:
|
|
484
|
+
preview += f"\n… and {len(selected) - 20} more"
|
|
485
|
+
prompter.note(
|
|
486
|
+
f'Import {len(selected)} models from "{_plain(name)}" into {SETTINGS_SOURCE_LABELS[source]}', preview,
|
|
487
|
+
)
|
|
488
|
+
if not await prompter.confirm("Import selected models?", default=True):
|
|
489
|
+
return None
|
|
490
|
+
return import_group_models(
|
|
491
|
+
session.cwd, source, name, selected,
|
|
492
|
+
{model["id"]: model["config"] for model in models if model["id"] in selected_ids and model.get("config")},
|
|
493
|
+
)
|
|
372
494
|
|
|
373
495
|
|
|
374
496
|
async def _choose_source(cwd: str, prompter: Prompter) -> WritableSettingsSource:
|