crabcode 0.1.9__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.9 → crabcode-0.1.10}/CLIENT_PACKAGING.md +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/PKG-INFO +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/pyproject.toml +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/Cargo.lock +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/Cargo.toml +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/Cargo.toml +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/_version.py +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/anthropic_adapter.py +48 -16
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/azure_adapter.py +3 -4
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/base.py +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/codex_adapter.py +12 -7
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/gemini_adapter.py +2 -4
- crabcode-0.1.10/packages/core/crabcode_core/api/network.py +145 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/ollama_adapter.py +5 -4
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/openai_adapter.py +62 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/config.py +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/pyproject.toml +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/pyproject.toml +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/package-lock.json +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/package.json +1 -1
- crabcode-0.1.10/packages/desktop/src/App.startup.test.tsx +165 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/App.tsx +154 -119
- crabcode-0.1.10/packages/desktop/src/ConnectionModal.test.tsx +97 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.files.test.tsx +7 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.tsx +8 -3
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SettingsView.test.tsx +48 -2
- {crabcode-0.1.9 → 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.9 → crabcode-0.1.10}/packages/desktop/src/main.tsx +1 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/platform.ts +5 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/styles.css +19 -5
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.lock +3 -3
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.toml +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/capabilities/default.json +4 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/lib.rs +15 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/tauri.conf.json +3 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/pyproject.toml +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/pyproject.toml +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/de.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/en.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/es.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/fr.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ja.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ko.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/pt-BR.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ru.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-CN.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-TW.json +7 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/CHANGELOG.md +7 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/README.md +3 -3
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package-lock.json +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.json +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package-lock.json +2 -2
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.json +1 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/webview.ts +3 -1
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +19 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/pyproject.toml +1 -1
- crabcode-0.1.10/tests/test_api_parameter_forwarding.py +319 -0
- crabcode-0.1.10/tests/test_openai_reasoning.py +206 -0
- crabcode-0.1.9/packages/core/crabcode_core/api/network.py +0 -69
- crabcode-0.1.9/packages/desktop/src/App.startup.test.tsx +0 -83
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/actions/client-apple-signing/action.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/client-packages.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/computer-use.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/document-engine-wheels.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/python-publish.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/windows-compat.yml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/.gitignore +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/README.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/README.zh-CN.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/__main__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/app.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/banner.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_picker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/pipe.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/messages.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/repl.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/session_picker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/hatch_build.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/Cargo.toml +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/README.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/build.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/channel.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/channel.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.d.cts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/package.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/src/channel.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/lib.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/build.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/lib.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/main.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/permission_guide.m +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/windows.rc +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/PROMPT.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.icns +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.ico +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/build-icons.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/build.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/check-wheel.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/live-smoke.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/_windows_process.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/agent_manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/error_logging.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_discovery.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_info.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/registry.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/command_line.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/compact.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_mode.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_observation.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/claudemd.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/model_catalog.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/events.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/file_lock.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/filesystem.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/goal.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/image_io.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/io_worker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/logging_utils.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/client.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/client.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/config.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/path_validation.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/paths.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/peer/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/peer/runtime.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/executor.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/types.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/blocks.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/context.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/library.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/claude-code.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/codex.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/cursor.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/dsh.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/kimi-code.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/opencode.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/qoder.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/zcode.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/profile.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/system.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/templates.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/loop.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/retry.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/models.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/store.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/timing.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/export.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/meta_db.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/storage.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/title_gen.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/context.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/loader.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/matcher.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/subprocess_utils.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/bridge.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/inbox.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/manager.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/message_bus.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/models.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/recovery.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/text_io.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/agent.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/ask_user.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/bash.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/browser.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checklist.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_edit.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_read.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_write.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/glob.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/goal.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/grep.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image_generate.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/lint.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/loading.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/memory.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/monitor.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/peer.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/revert.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/schedule.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/skill.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/team.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/tool_search.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/web_search.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/turn_details.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/event.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/message.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/tool.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/usage.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/adapters.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/dap.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/memory.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/process.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/runtime.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/sessions.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/tool.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/README.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/THEMES.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/index.html +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/App.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ApprovalShortcutSettings.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/CopyButton.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentViewTabs.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ReviewMenu.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/RuntimeSettingsPanel.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/StatusBar.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/StatusBar.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.css +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/computerUse.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/computerUse.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/diffRows.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/events.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/events.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/favorites.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/favorites.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gateway.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gateway.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayErrors.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/i18n.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/markdownMath.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.lume.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.startup.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/pathUtils.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/permissionPresentation.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/promptTemplateFile.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/reviewHistory.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/theme.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/theme.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/themePackages.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/themePackages.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/turnDetails.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/types.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useGitReview.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useGitReview.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.test.tsx +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/uuid.test.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/uuid.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/virtualMachine.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/vite-env.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/build.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/32x32.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.icns +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.ico +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/main.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/paths.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/settings.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/windows_python.rs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/tsconfig.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/vite.config.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/adapter.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/auth.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/middleware.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/protocol.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/config.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/schemas.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/server.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/__init__.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/background.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/chunker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/embedder.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/indexer.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/store.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/tool.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/README.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/index.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/index.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/metadata.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/metadata.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/runtime.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/runtime.test.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/package.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/slashCommands.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/slashCommands.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/turnProcess.d.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/turnProcess.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.gitignore +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.nvmrc +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscode/launch.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscode/tasks.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscodeignore +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/LICENSE +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/.vscodeignore +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/LICENSE +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/README.md +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/esbuild.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/extension.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/logo.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.de.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.es.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.fr.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ja.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ko.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.pt-br.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ru.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/esbuild.js +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/logo.png +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.de.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.es.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.fr.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ja.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ko.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.pt-br.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ru.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.zh-cn.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.zh-tw.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/resources/icon.svg +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/scripts/gen-types.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/chat/markdown.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/chatPanel.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/permissionPresentation.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/protocol.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/types.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/computerUse.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/connection.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/crabCodeSettingsPanel.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/extension.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/gatewayManager.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/i18n.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/ideContext.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/pendingEdits.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/promptTemplateFile.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/runtimeControls.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/catalog.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/protocol.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/webview.css +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/windowsPython.ts +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/chatMarkdown.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseController.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseNative.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/contextUsage.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/followUp.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/gatewayManager.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/i18n.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/settingsHarness.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/i18n.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/ideContext.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/imageCaptions.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/permissionPolicy.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/sessionModel.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/sessionScope.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/slashCommands.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/streamRetry.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/turnDetails.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/turnProcess.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/windowsPython.test.cjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tsconfig.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tsconfig.webview.json +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/audit_tool_cards.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/build_document_engine_bundle.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/i18n.mjs +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/package_clients.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/prompt_budget.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/scripts/sync_version.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_api_error_logging.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_apply_patch.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_api_recovery.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_composer.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_model_management.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_model_picker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_session_picker.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_yolo.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_client_packaging.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_codex_context_window.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_compact_prompt.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_compaction_settings.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_ax.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_history.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_observation.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_packaging.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_policy.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_window_observations.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_config_home.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_context_token_accounting.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_follow_up_messages.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_new_session_controls.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_runtime_info.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_send_message.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_git_review.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_image_context.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_image_tool.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_io_isolation.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_connection.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_discovery.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_info.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_settings_delete.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_network_policy.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_openai_tool_images.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_permission_policy_status.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_project_model_catalog.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_loading.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_presets.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_settings.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_read_images.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_reasoning_effort.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_resume_model.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_sdk_transport_compat.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_session_storage_performance.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_stream_reconnect.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_tool_loading.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_turn_details.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_usage.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_web_search.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_windows_audit_regressions.py +0 -0
- {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_windows_compat.py +0 -0
|
@@ -12,7 +12,7 @@ runner, then reuses those bundles for the extensions and installers.
|
|
|
12
12
|
|
|
13
13
|
The workflow must be committed before creating the release tag. The tag must be
|
|
14
14
|
the version in the checked-out client manifests, with an optional `v` prefix
|
|
15
|
-
(for example, `0.1.
|
|
15
|
+
(for example, `0.1.10` or `v0.1.10`). Version mismatches fail before native builds.
|
|
16
16
|
Use a new version when changing published packages; existing registry versions
|
|
17
17
|
are not replaced. The independent `python-publish.yml` workflow continues to
|
|
18
18
|
handle Python/PyPI publishing.
|
|
@@ -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.10"
|
|
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.10",
|
|
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.10"
|
|
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.10"
|
|
427
427
|
dependencies = [
|
|
428
428
|
"cc",
|
|
429
429
|
"crabcode-computer-use-core",
|
|
@@ -183,22 +183,17 @@ class AnthropicAdapter(APIAdapter):
|
|
|
183
183
|
return
|
|
184
184
|
|
|
185
185
|
payload = dict(params)
|
|
186
|
+
payload.update(payload.pop("extra_body", {}))
|
|
186
187
|
payload["stream"] = True
|
|
187
|
-
|
|
188
|
-
timeout =
|
|
189
|
-
float(self.config.timeout),
|
|
190
|
-
connect=min(float(self.config.timeout), 10.0),
|
|
191
|
-
read=float(self.config.timeout),
|
|
192
|
-
write=float(self.config.timeout),
|
|
193
|
-
)
|
|
194
|
-
from crabcode_core.api.network import http_options
|
|
188
|
+
from crabcode_core.api.network import http_options, request_timeout, retry_stream_context
|
|
189
|
+
timeout = payload.pop("timeout", request_timeout(self.config))
|
|
195
190
|
async with httpx.AsyncClient(timeout=timeout, **http_options(self.config)) as client:
|
|
196
|
-
async with client.stream(
|
|
191
|
+
async with retry_stream_context(self.config, lambda: client.stream(
|
|
197
192
|
"POST",
|
|
198
193
|
url,
|
|
199
194
|
headers=self._manual_headers(),
|
|
200
195
|
json=payload,
|
|
201
|
-
) as response:
|
|
196
|
+
)) as response:
|
|
202
197
|
content_type = response.headers.get("content-type", "")
|
|
203
198
|
if response.status_code >= 400:
|
|
204
199
|
body = await response.aread()
|
|
@@ -425,11 +420,24 @@ class AnthropicAdapter(APIAdapter):
|
|
|
425
420
|
"budget_tokens": config.thinking_budget,
|
|
426
421
|
}
|
|
427
422
|
|
|
428
|
-
|
|
429
|
-
|
|
423
|
+
reasoning_effort = (
|
|
424
|
+
config.reasoning_effort
|
|
425
|
+
if config.reasoning_effort is not None
|
|
426
|
+
else self.config.reasoning_effort
|
|
427
|
+
)
|
|
428
|
+
if reasoning_effort == "minimal":
|
|
429
|
+
reasoning_effort = "low"
|
|
430
|
+
if reasoning_effort in {"low", "medium", "high", "xhigh", "max"}:
|
|
431
|
+
params["output_config"] = {"effort": reasoning_effort}
|
|
432
|
+
elif reasoning_effort == "none":
|
|
433
|
+
params["thinking"] = {"type": "disabled"}
|
|
430
434
|
|
|
431
435
|
if config.temperature is not None:
|
|
432
436
|
params["temperature"] = config.temperature
|
|
437
|
+
if config.stop_sequences is not None:
|
|
438
|
+
params["stop_sequences"] = safe_utf8_json_tree(config.stop_sequences)
|
|
439
|
+
if self.config.extra_body:
|
|
440
|
+
params["extra_body"] = safe_utf8_json_tree(self.config.extra_body)
|
|
433
441
|
|
|
434
442
|
return params
|
|
435
443
|
|
|
@@ -441,8 +449,9 @@ class AnthropicAdapter(APIAdapter):
|
|
|
441
449
|
if isinstance(self, (BedrockAdapter, VertexAdapter)):
|
|
442
450
|
return None
|
|
443
451
|
payload = self._request_params(messages, system, tools, config)
|
|
444
|
-
payload.pop("
|
|
445
|
-
|
|
452
|
+
payload.update(payload.pop("extra_body", {}))
|
|
453
|
+
supported = {"model", "messages", "system", "tools", "tool_choice", "thinking"}
|
|
454
|
+
payload = {key: value for key, value in payload.items() if key in supported}
|
|
446
455
|
headers = {key: value for key, value in self._manual_headers().items()
|
|
447
456
|
if key.lower() != "accept"}
|
|
448
457
|
headers["accept"] = "application/json"
|
|
@@ -463,6 +472,13 @@ class AnthropicAdapter(APIAdapter):
|
|
|
463
472
|
use_httpx_stream = transport == "httpx" or (
|
|
464
473
|
transport == "auto" and bool(self.config.base_url)
|
|
465
474
|
)
|
|
475
|
+
# Cloud platforms need their SDK's signing/authentication and URL format.
|
|
476
|
+
if isinstance(self, (BedrockAdapter, VertexAdapter)):
|
|
477
|
+
use_httpx_stream = False
|
|
478
|
+
from crabcode_core.api.network import request_timeout
|
|
479
|
+
params["timeout"] = request_timeout(
|
|
480
|
+
config, None if use_httpx_stream else self._sdk, fallback=self.config,
|
|
481
|
+
)
|
|
466
482
|
stream = (
|
|
467
483
|
self._stream_message_httpx(params) if use_httpx_stream
|
|
468
484
|
else self._stream_message_sdk(params)
|
|
@@ -510,7 +526,8 @@ class AnthropicAdapter(APIAdapter):
|
|
|
510
526
|
current_block_type = ""
|
|
511
527
|
current_block_id = ""
|
|
512
528
|
|
|
513
|
-
|
|
529
|
+
from crabcode_core.api.network import retry_stream_context
|
|
530
|
+
async with retry_stream_context(self.config, lambda: self.client.messages.stream(**params)) as stream:
|
|
514
531
|
async for event in stream:
|
|
515
532
|
event_type = getattr(event, "type", "")
|
|
516
533
|
|
|
@@ -633,7 +650,14 @@ class BedrockAdapter(AnthropicAdapter):
|
|
|
633
650
|
def __init__(self, config: ApiConfig):
|
|
634
651
|
self.config = config
|
|
635
652
|
from crabcode_core.api.network import sdk_options
|
|
636
|
-
|
|
653
|
+
kwargs: dict[str, Any] = {}
|
|
654
|
+
if config.base_url:
|
|
655
|
+
kwargs["base_url"] = config.base_url
|
|
656
|
+
if config.http_headers:
|
|
657
|
+
kwargs["default_headers"] = config.http_headers
|
|
658
|
+
if config.api_key_env and os.environ.get(config.api_key_env):
|
|
659
|
+
kwargs["api_key"] = os.environ[config.api_key_env]
|
|
660
|
+
self.client = anthropic.AsyncAnthropicBedrock(**kwargs, **sdk_options(config, self._sdk))
|
|
637
661
|
|
|
638
662
|
|
|
639
663
|
class VertexAdapter(AnthropicAdapter):
|
|
@@ -642,8 +666,16 @@ class VertexAdapter(AnthropicAdapter):
|
|
|
642
666
|
def __init__(self, config: ApiConfig):
|
|
643
667
|
from crabcode_core.api.network import sdk_options
|
|
644
668
|
self.config = config
|
|
669
|
+
kwargs: dict[str, Any] = {}
|
|
670
|
+
if config.base_url:
|
|
671
|
+
kwargs["base_url"] = config.base_url
|
|
672
|
+
if config.http_headers:
|
|
673
|
+
kwargs["default_headers"] = config.http_headers
|
|
674
|
+
if config.api_key_env and os.environ.get(config.api_key_env):
|
|
675
|
+
kwargs["access_token"] = os.environ[config.api_key_env]
|
|
645
676
|
self.client = anthropic.AsyncAnthropicVertex(
|
|
646
677
|
region=os.environ.get("CLOUD_ML_REGION", "us-east5"),
|
|
647
678
|
project_id=os.environ.get("ANTHROPIC_VERTEX_PROJECT_ID"),
|
|
679
|
+
**kwargs,
|
|
648
680
|
**sdk_options(config, self._sdk),
|
|
649
681
|
)
|
|
@@ -24,8 +24,7 @@ class AzureOpenAIAdapter(OpenAIAdapter):
|
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
26
|
def __init__(self, config: ApiConfig):
|
|
27
|
-
|
|
28
|
-
self._deployment_override = os.environ.get("AZURE_OPENAI_DEPLOYMENT")
|
|
27
|
+
self._deployment_override = config.azure_deployment or os.environ.get("AZURE_OPENAI_DEPLOYMENT")
|
|
29
28
|
super().__init__(config)
|
|
30
29
|
|
|
31
30
|
def _create_client(self, config: ApiConfig) -> Any:
|
|
@@ -40,12 +39,12 @@ class AzureOpenAIAdapter(OpenAIAdapter):
|
|
|
40
39
|
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
|
|
41
40
|
|
|
42
41
|
# --- Azure endpoint ---
|
|
43
|
-
azure_endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
|
|
42
|
+
azure_endpoint = config.azure_endpoint or os.environ.get("AZURE_OPENAI_ENDPOINT")
|
|
44
43
|
if not azure_endpoint and config.base_url:
|
|
45
44
|
azure_endpoint = config.base_url
|
|
46
45
|
|
|
47
46
|
# --- API version ---
|
|
48
|
-
api_version = os.environ.get("AZURE_OPENAI_API_VERSION", "2024-10-21")
|
|
47
|
+
api_version = config.azure_api_version or os.environ.get("AZURE_OPENAI_API_VERSION", "2024-10-21")
|
|
49
48
|
|
|
50
49
|
kwargs: dict[str, Any] = {}
|
|
51
50
|
if api_key:
|
|
@@ -79,9 +79,9 @@ class ModelConfig:
|
|
|
79
79
|
thinking_budget: int = 10000
|
|
80
80
|
temperature: float | None = None
|
|
81
81
|
stop_sequences: list[str] | None = None
|
|
82
|
-
timeout: int =
|
|
82
|
+
timeout: int | None = None # seconds; None inherits the adapter configuration
|
|
83
83
|
context_window: int = 0 # 0 means unknown / not resolved yet
|
|
84
|
-
reasoning_effort: str | None = None # call-level override for
|
|
84
|
+
reasoning_effort: str | None = None # call-level override for the provider's reasoning effort
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
@dataclass
|
|
@@ -795,13 +795,15 @@ class CodexAdapter(APIAdapter):
|
|
|
795
795
|
self,
|
|
796
796
|
params: dict[str, Any],
|
|
797
797
|
) -> AsyncGenerator[StreamChunk, None]:
|
|
798
|
+
params = dict(params)
|
|
799
|
+
from crabcode_core.api.network import http_options, request_timeout
|
|
800
|
+
timeout = params.pop("timeout", request_timeout(self.config))
|
|
798
801
|
url = f"{self._base_url.rstrip('/')}/responses"
|
|
799
802
|
active_calls: dict[str, dict[str, str]] = {}
|
|
800
803
|
finalized_call_items: set[str] = set()
|
|
801
804
|
saw_terminal_event = False
|
|
802
805
|
|
|
803
|
-
|
|
804
|
-
async with httpx.AsyncClient(timeout=request_timeout(self.config), **http_options(self.config)) as client:
|
|
806
|
+
async with httpx.AsyncClient(timeout=timeout, **http_options(self.config)) as client:
|
|
805
807
|
async with self._httpx_stream_with_retry(
|
|
806
808
|
client,
|
|
807
809
|
url=url,
|
|
@@ -1026,6 +1028,8 @@ class CodexAdapter(APIAdapter):
|
|
|
1026
1028
|
tools: list[dict[str, Any]], config: ModelConfig,
|
|
1027
1029
|
) -> dict[str, Any]:
|
|
1028
1030
|
"""Share input serialization between generation and server counting."""
|
|
1031
|
+
if config.stop_sequences:
|
|
1032
|
+
raise ValueError("The Responses API does not support stop_sequences")
|
|
1029
1033
|
model = config.model or self.config.model or "codex-mini-latest"
|
|
1030
1034
|
|
|
1031
1035
|
# Responses API uses 'instructions' for system prompt
|
|
@@ -1067,11 +1071,9 @@ class CodexAdapter(APIAdapter):
|
|
|
1067
1071
|
else self.config.reasoning_effort
|
|
1068
1072
|
)
|
|
1069
1073
|
if reasoning_effort is not None:
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
"summary": "auto",
|
|
1074
|
-
}
|
|
1074
|
+
params["reasoning"] = {"effort": reasoning_effort}
|
|
1075
|
+
if reasoning_effort != "none" and config.thinking_enabled:
|
|
1076
|
+
params["reasoning"]["summary"] = "auto"
|
|
1075
1077
|
elif config.thinking_enabled:
|
|
1076
1078
|
# Backward-compatible mapping from thinking_budget to reasoning effort
|
|
1077
1079
|
budget = config.thinking_budget
|
|
@@ -1120,6 +1122,9 @@ class CodexAdapter(APIAdapter):
|
|
|
1120
1122
|
sdk_params = self._request_params(messages, system, tools, config)
|
|
1121
1123
|
raw_params = dict(sdk_params)
|
|
1122
1124
|
raw_params.update(raw_params.pop("extra_body", {}))
|
|
1125
|
+
from crabcode_core.api.network import request_timeout
|
|
1126
|
+
sdk_params["timeout"] = request_timeout(config, getattr(self, "_sdk", None), fallback=self.config)
|
|
1127
|
+
raw_params["timeout"] = request_timeout(config, fallback=self.config)
|
|
1123
1128
|
|
|
1124
1129
|
if self._using_codex_oauth:
|
|
1125
1130
|
# The Codex OAuth endpoint does not support server-side response
|
|
@@ -12,8 +12,8 @@ class GeminiAdapter(OpenAIAdapter):
|
|
|
12
12
|
Google Gemini has provided an OpenAI-compatible endpoint since late 2024
|
|
13
13
|
(``https://generativelanguage.googleapis.com/v1beta/openai/``), so we
|
|
14
14
|
simply inherit from :class:`OpenAIAdapter` and pre-fill the base URL,
|
|
15
|
-
API key environment variable
|
|
16
|
-
|
|
15
|
+
and API key environment variable. The shared adapter forwards reasoning
|
|
16
|
+
effort and requests thought summaries through Google's extra_body extension.
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
def __init__(self, config: ApiConfig):
|
|
@@ -21,6 +21,4 @@ class GeminiAdapter(OpenAIAdapter):
|
|
|
21
21
|
config = config.model_copy(update={"base_url": "https://generativelanguage.googleapis.com/v1beta/openai/"})
|
|
22
22
|
if not config.api_key_env:
|
|
23
23
|
config = config.model_copy(update={"api_key_env": "GEMINI_API_KEY"})
|
|
24
|
-
if config.thinking_enabled is True:
|
|
25
|
-
config = config.model_copy(update={"thinking_enabled": False})
|
|
26
24
|
super().__init__(config)
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"""Shared HTTP routing policy. Never fall back from a proxy to direct access."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import asyncio
|
|
5
|
+
from contextlib import asynccontextmanager
|
|
6
|
+
import ssl
|
|
7
|
+
import sys
|
|
8
|
+
from typing import Any, AsyncIterator, Awaitable, Callable, TypeVar
|
|
9
|
+
from urllib.parse import urlsplit
|
|
10
|
+
|
|
11
|
+
import httpx
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def http_options(config: Any) -> dict[str, Any]:
|
|
15
|
+
mode = getattr(config, "network_mode", "inherit")
|
|
16
|
+
if mode == "inherit":
|
|
17
|
+
return {}
|
|
18
|
+
if mode == "direct":
|
|
19
|
+
return {"trust_env": False}
|
|
20
|
+
proxy = getattr(config, "proxy_url", None)
|
|
21
|
+
try:
|
|
22
|
+
parsed = urlsplit(proxy or "")
|
|
23
|
+
valid = parsed.scheme in {"http", "https"} and bool(parsed.hostname) and parsed.port != 0
|
|
24
|
+
valid = valid and not parsed.username and not parsed.password
|
|
25
|
+
except ValueError:
|
|
26
|
+
valid = False
|
|
27
|
+
if not valid:
|
|
28
|
+
raise ValueError("Proxy mode requires an HTTP(S) proxy URL without embedded credentials")
|
|
29
|
+
return {"trust_env": False, "proxy": proxy}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def request_timeout(config: Any, sdk: Any = None, *, fallback: Any = None) -> Any:
|
|
33
|
+
value = getattr(config, "timeout", None)
|
|
34
|
+
timeout = float(value if value is not None else getattr(fallback, "timeout", 300))
|
|
35
|
+
# SDK exports follow their supported transport (httpx or httpx2).
|
|
36
|
+
timeout_type = sdk.Timeout if sdk is not None else httpx.Timeout
|
|
37
|
+
return timeout_type(timeout, connect=min(timeout, 10.0))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def sdk_http_client(config: Any, sdk: Any = None) -> Any:
|
|
41
|
+
client_type = sdk.DefaultAsyncHttpxClient if sdk is not None else httpx.AsyncClient
|
|
42
|
+
return client_type(**http_options(config), timeout=request_timeout(config, sdk))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def sdk_options(config: Any, sdk: Any) -> dict[str, Any]:
|
|
46
|
+
# Adapters own request retries; the query loop owns stream reconnects.
|
|
47
|
+
# Disable SDK retries so they do not multiply those budgets.
|
|
48
|
+
options: dict[str, Any] = {"max_retries": 0, "timeout": request_timeout(config, sdk)}
|
|
49
|
+
routing = http_options(config)
|
|
50
|
+
if routing:
|
|
51
|
+
options["http_client"] = sdk_http_client(config, sdk)
|
|
52
|
+
return options
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
_T = TypeVar("_T")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def request_error_is_retryable(exc: BaseException) -> bool:
|
|
59
|
+
"""Only transport failures and 5xx belong to the request retry budget."""
|
|
60
|
+
if certificate_failure(exc):
|
|
61
|
+
return False
|
|
62
|
+
pending = [exc]
|
|
63
|
+
seen: set[int] = set()
|
|
64
|
+
while pending:
|
|
65
|
+
current = pending.pop()
|
|
66
|
+
if id(current) in seen:
|
|
67
|
+
continue
|
|
68
|
+
seen.add(id(current))
|
|
69
|
+
if isinstance(current, httpx.TransportError):
|
|
70
|
+
return True
|
|
71
|
+
status = getattr(current, "status_code", None)
|
|
72
|
+
if isinstance(status, int) and status >= 500:
|
|
73
|
+
return True
|
|
74
|
+
pending.extend(item for item in (current.__cause__, current.__context__) if item is not None)
|
|
75
|
+
return False
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def request_retry_limit(config: Any) -> int:
|
|
79
|
+
from crabcode_core.query.retry import MAX_REQUEST_RETRIES
|
|
80
|
+
return min(max(0, int(getattr(config, "request_max_retries", 4))), MAX_REQUEST_RETRIES)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
async def retry_request(config: Any, request: Callable[[], Awaitable[_T]]) -> _T:
|
|
84
|
+
"""Retry opening a request, never reading/replaying a started stream."""
|
|
85
|
+
from crabcode_core.query.retry import request_retry_backoff
|
|
86
|
+
limit = request_retry_limit(config)
|
|
87
|
+
for attempt in range(limit + 1):
|
|
88
|
+
try:
|
|
89
|
+
return await request()
|
|
90
|
+
except Exception as exc:
|
|
91
|
+
if attempt >= limit or not request_error_is_retryable(exc):
|
|
92
|
+
raise
|
|
93
|
+
await asyncio.sleep(request_retry_backoff(attempt + 1))
|
|
94
|
+
raise RuntimeError("unreachable request retry state")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@asynccontextmanager
|
|
98
|
+
async def retry_stream_context(config: Any, factory: Callable[[], Any]) -> AsyncIterator[Any]:
|
|
99
|
+
"""Open an SDK/HTTP stream with retries and always close its context."""
|
|
100
|
+
from crabcode_core.query.retry import request_retry_backoff
|
|
101
|
+
limit = request_retry_limit(config)
|
|
102
|
+
for attempt in range(limit + 1):
|
|
103
|
+
manager = factory()
|
|
104
|
+
try:
|
|
105
|
+
stream = await manager.__aenter__()
|
|
106
|
+
except Exception as exc:
|
|
107
|
+
if attempt >= limit or not request_error_is_retryable(exc):
|
|
108
|
+
raise
|
|
109
|
+
else:
|
|
110
|
+
# Raw HTTP returns error responses; SDKs raise on context entry.
|
|
111
|
+
# Return the final response intact for provider error diagnostics.
|
|
112
|
+
status = getattr(stream, "status_code", 0)
|
|
113
|
+
if not isinstance(status, int) or status < 500 or attempt >= limit:
|
|
114
|
+
break
|
|
115
|
+
await manager.__aexit__(None, None, None)
|
|
116
|
+
await asyncio.sleep(request_retry_backoff(attempt + 1))
|
|
117
|
+
try:
|
|
118
|
+
yield stream
|
|
119
|
+
except BaseException:
|
|
120
|
+
if not await manager.__aexit__(*sys.exc_info()):
|
|
121
|
+
raise
|
|
122
|
+
else:
|
|
123
|
+
await manager.__aexit__(None, None, None)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def certificate_failure(exc: BaseException) -> bool:
|
|
127
|
+
seen: set[int] = set()
|
|
128
|
+
pending = [exc]
|
|
129
|
+
while pending:
|
|
130
|
+
current = pending.pop()
|
|
131
|
+
if id(current) in seen:
|
|
132
|
+
continue
|
|
133
|
+
seen.add(id(current))
|
|
134
|
+
if isinstance(current, ssl.SSLCertVerificationError) or "CERTIFICATE_VERIFY_FAILED" in str(current):
|
|
135
|
+
return True
|
|
136
|
+
pending.extend(item for item in (current.__cause__, current.__context__) if item is not None)
|
|
137
|
+
return False
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def network_error_message(exc: BaseException, config: Any) -> str:
|
|
141
|
+
if certificate_failure(exc):
|
|
142
|
+
return "模型连接证书校验失败,请检查证书或网络拦截;未自动重试"
|
|
143
|
+
mode = getattr(config, "network_mode", "inherit")
|
|
144
|
+
route = {"inherit": "继承进程代理环境", "direct": "直连", "proxy": "指定代理"}.get(mode, mode)
|
|
145
|
+
return f"模型连接中断({type(exc).__name__},{route})。请检查网络或代理状态后重试;更改系统环境变量需重启 Gateway。"
|
|
@@ -12,8 +12,8 @@ class OllamaAdapter(OpenAIAdapter):
|
|
|
12
12
|
Ollama natively exposes an OpenAI-compatible endpoint at
|
|
13
13
|
``http://localhost:11434/v1`` and does not require a real API key,
|
|
14
14
|
but the OpenAI SDK still expects *some* value for ``api_key``.
|
|
15
|
-
This adapter pre-fills those defaults and
|
|
16
|
-
|
|
15
|
+
This adapter pre-fills those defaults and preserves reasoning controls
|
|
16
|
+
for local models that support thinking.
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
def __init__(self, config: ApiConfig):
|
|
@@ -22,6 +22,7 @@ class OllamaAdapter(OpenAIAdapter):
|
|
|
22
22
|
config = config.model_copy(update={"base_url": "http://localhost:11434/v1"})
|
|
23
23
|
if not config.api_key_env:
|
|
24
24
|
config = config.model_copy(update={"api_key_env": "OLLAMA_API_KEY"})
|
|
25
|
-
if config.thinking_enabled is True:
|
|
26
|
-
config = config.model_copy(update={"thinking_enabled": False})
|
|
27
25
|
super().__init__(config)
|
|
26
|
+
|
|
27
|
+
def _allows_placeholder_api_key(self) -> bool:
|
|
28
|
+
return True
|
|
@@ -181,6 +181,8 @@ class OpenAIAdapter(APIAdapter):
|
|
|
181
181
|
api_key: str | None = None
|
|
182
182
|
if config.api_key_env:
|
|
183
183
|
api_key = os.environ.get(config.api_key_env)
|
|
184
|
+
if not api_key and self._allows_placeholder_api_key():
|
|
185
|
+
api_key = "ollama"
|
|
184
186
|
if not api_key:
|
|
185
187
|
api_key = os.environ.get("OPENAI_API_KEY")
|
|
186
188
|
|
|
@@ -195,6 +197,9 @@ class OpenAIAdapter(APIAdapter):
|
|
|
195
197
|
from crabcode_core.api.network import sdk_options
|
|
196
198
|
return openai.AsyncOpenAI(**kwargs, **sdk_options(config, self._sdk))
|
|
197
199
|
|
|
200
|
+
def _allows_placeholder_api_key(self) -> bool:
|
|
201
|
+
return False
|
|
202
|
+
|
|
198
203
|
def _resolve_model(self, config: ModelConfig) -> str:
|
|
199
204
|
"""Resolve the model name for the API call. Override in subclasses."""
|
|
200
205
|
return config.model or self.config.model or "gpt-4o"
|
|
@@ -226,14 +231,69 @@ class OpenAIAdapter(APIAdapter):
|
|
|
226
231
|
|
|
227
232
|
if config.temperature is not None:
|
|
228
233
|
params["temperature"] = config.temperature
|
|
229
|
-
|
|
234
|
+
if config.stop_sequences is not None:
|
|
235
|
+
params["stop"] = safe_utf8_json_tree(config.stop_sequences)
|
|
236
|
+
if self.config.prompt_cache_key:
|
|
237
|
+
params["prompt_cache_key"] = self.config.prompt_cache_key
|
|
238
|
+
if self.config.prompt_cache_retention:
|
|
239
|
+
params["prompt_cache_retention"] = self.config.prompt_cache_retention
|
|
240
|
+
|
|
241
|
+
reasoning_effort = (
|
|
242
|
+
config.reasoning_effort
|
|
243
|
+
if config.reasoning_effort is not None
|
|
244
|
+
else self.config.reasoning_effort
|
|
245
|
+
)
|
|
246
|
+
if self._allows_placeholder_api_key() and reasoning_effort is None and not config.thinking_enabled:
|
|
247
|
+
reasoning_effort = "none"
|
|
230
248
|
extra_body = safe_utf8_json_tree(dict(self.config.extra_body or {}))
|
|
249
|
+
model_name = model.rsplit("/", 1)[-1].lower()
|
|
250
|
+
is_gemini = (
|
|
251
|
+
model_name.startswith("gemini-")
|
|
252
|
+
or self.config.provider == "gemini"
|
|
253
|
+
or (self.config.provider == "router" and self.config.format == "gemini")
|
|
254
|
+
)
|
|
255
|
+
if is_gemini:
|
|
256
|
+
# The shared composer has higher effort levels than Gemini exposes.
|
|
257
|
+
if reasoning_effort in {"xhigh", "max"}:
|
|
258
|
+
reasoning_effort = "high"
|
|
259
|
+
|
|
260
|
+
# Python SDK extra_body is merged into the HTTP body. Google's
|
|
261
|
+
# extension itself is a nested wire-level "extra_body" field.
|
|
262
|
+
# Preserve explicit provider settings, including summary opt-out.
|
|
263
|
+
# Legacy non-thinking models must not receive a thinking config.
|
|
264
|
+
google_extra = (
|
|
265
|
+
extra_body.setdefault("extra_body", {})
|
|
266
|
+
if not model_name.startswith(("gemini-1.", "gemini-2.0"))
|
|
267
|
+
else None
|
|
268
|
+
)
|
|
269
|
+
if isinstance(google_extra, dict):
|
|
270
|
+
google = google_extra.setdefault("google", {})
|
|
271
|
+
if isinstance(google, dict):
|
|
272
|
+
thinking = google.setdefault("thinking_config", {})
|
|
273
|
+
if isinstance(thinking, dict):
|
|
274
|
+
if "includeThoughts" not in thinking:
|
|
275
|
+
thinking.setdefault("include_thoughts", config.thinking_enabled)
|
|
276
|
+
# Native level/budget and OpenAI effort are mutually
|
|
277
|
+
# exclusive. Explicit extra_body remains authoritative.
|
|
278
|
+
if any(key in thinking for key in (
|
|
279
|
+
"thinking_level", "thinking_budget", "thinkingLevel", "thinkingBudget",
|
|
280
|
+
)):
|
|
281
|
+
reasoning_effort = None
|
|
282
|
+
elif model_name.startswith("gemini-2.5-") and reasoning_effort is None and config.thinking_enabled:
|
|
283
|
+
# Token budgets are supported by 2.5; later models
|
|
284
|
+
# use named levels instead. Explicit effort wins.
|
|
285
|
+
thinking["thinking_budget"] = config.thinking_budget
|
|
286
|
+
|
|
287
|
+
if reasoning_effort is not None:
|
|
288
|
+
params["reasoning_effort"] = reasoning_effort
|
|
231
289
|
if extra_body:
|
|
232
290
|
params["extra_body"] = extra_body
|
|
233
291
|
|
|
234
292
|
tool_call_buffers: dict[int, dict[str, str]] = {}
|
|
235
293
|
|
|
236
|
-
|
|
294
|
+
from crabcode_core.api.network import request_timeout, retry_request
|
|
295
|
+
params["timeout"] = request_timeout(config, getattr(self, "_sdk", None), fallback=self.config)
|
|
296
|
+
stream = await retry_request(self.config, lambda: self.client.chat.completions.create(**params))
|
|
237
297
|
async for chunk in stream:
|
|
238
298
|
if not chunk.choices:
|
|
239
299
|
if chunk.usage:
|
|
@@ -129,7 +129,7 @@ class ApiConfig(BaseModel):
|
|
|
129
129
|
# Explicit opt-in for a separate unbounded 5s..60s connection retry path.
|
|
130
130
|
unbounded_connection_retries: bool = False
|
|
131
131
|
context_window: int | None = None # override auto-detected context window
|
|
132
|
-
prompt_cache_key: str | None = None # OpenAI
|
|
132
|
+
prompt_cache_key: str | None = None # OpenAI Chat Completions / Responses cache routing key
|
|
133
133
|
prompt_caching: Literal["auto", "enabled", "disabled"] = "auto"
|
|
134
134
|
prompt_cache_retention: Literal["in_memory", "24h"] | None = None
|
|
135
135
|
extra_body: dict[str, Any] = Field(default_factory=dict)
|
|
@@ -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.10"
|
|
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.10"
|
|
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.10",
|
|
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.10",
|
|
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.10",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@tauri-apps/api": "^2.8.0",
|
|
12
12
|
"@tauri-apps/plugin-global-shortcut": "^2.3.2",
|