crabcode 0.1.7__tar.gz → 0.1.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/windows-compat.yml +1 -0
  2. {crabcode-0.1.7 → crabcode-0.1.8}/PKG-INFO +1 -1
  3. {crabcode-0.1.7 → crabcode-0.1.8}/README.md +2 -0
  4. {crabcode-0.1.7 → crabcode-0.1.8}/README.zh-CN.md +2 -0
  5. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/pyproject.toml +2 -2
  6. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/Cargo.lock +2 -2
  7. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/Cargo.toml +1 -1
  8. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/Cargo.toml +1 -1
  9. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/_version.py +1 -1
  10. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/anthropic_adapter.py +4 -3
  11. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/azure_adapter.py +1 -1
  12. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/base.py +2 -2
  13. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/codex_adapter.py +2 -1
  14. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/model_discovery.py +66 -5
  15. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/network.py +12 -5
  16. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/openai_adapter.py +4 -1
  17. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/pyproject.toml +1 -1
  18. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/pyproject.toml +2 -2
  19. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/package-lock.json +2 -2
  20. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/package.json +1 -1
  21. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/GroupModelDiscovery.test.tsx +7 -3
  22. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/GroupModelDiscovery.tsx +14 -4
  23. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ModelSettingsPanel.tsx +1 -1
  24. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/types.ts +9 -1
  25. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/Cargo.lock +3 -3
  26. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/Cargo.toml +1 -1
  27. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/tauri.conf.json +1 -1
  28. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/config.py +11 -3
  29. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/schemas.py +24 -0
  30. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/pyproject.toml +2 -2
  31. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/pyproject.toml +2 -2
  32. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/de.json +2 -1
  33. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/en.json +2 -1
  34. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/es.json +2 -1
  35. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/fr.json +2 -1
  36. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ja.json +2 -1
  37. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ko.json +2 -1
  38. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/pt-BR.json +2 -1
  39. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/ru.json +2 -1
  40. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/zh-CN.json +2 -1
  41. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/locales/zh-TW.json +2 -1
  42. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/README.md +7 -3
  43. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package-lock.json +2 -2
  44. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.json +1 -1
  45. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package-lock.json +2 -2
  46. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.json +1 -1
  47. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/types.ts +20 -0
  48. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/gatewayManager.ts +39 -14
  49. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/webview.ts +13 -3
  50. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +6 -0
  51. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/gatewayManager.test.cjs +95 -1
  52. {crabcode-0.1.7 → crabcode-0.1.8}/pyproject.toml +1 -1
  53. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_discovery.py +109 -0
  54. crabcode-0.1.8/tests/test_sdk_transport_compat.py +42 -0
  55. {crabcode-0.1.7 → crabcode-0.1.8}/.github/actions/client-apple-signing/action.yml +0 -0
  56. {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/client-packages.yml +0 -0
  57. {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/computer-use.yml +0 -0
  58. {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/document-engine-wheels.yml +0 -0
  59. {crabcode-0.1.7 → crabcode-0.1.8}/.github/workflows/python-publish.yml +0 -0
  60. {crabcode-0.1.7 → crabcode-0.1.8}/.gitignore +0 -0
  61. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/__init__.py +0 -0
  62. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/__main__.py +0 -0
  63. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/app.py +0 -0
  64. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/banner.py +0 -0
  65. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/computer_use.py +0 -0
  66. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/model_manager.py +0 -0
  67. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/model_picker.py +0 -0
  68. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/pipe.py +0 -0
  69. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/render/__init__.py +0 -0
  70. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/render/messages.py +0 -0
  71. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/repl.py +0 -0
  72. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/crabcode_cli/session_picker.py +0 -0
  73. {crabcode-0.1.7 → crabcode-0.1.8}/packages/cli/hatch_build.py +0 -0
  74. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/Cargo.toml +0 -0
  75. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/README.md +0 -0
  76. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/build.mjs +0 -0
  77. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/channel.d.ts +0 -0
  78. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/channel.js +0 -0
  79. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nativeClient.cjs +0 -0
  80. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nativeClient.d.cts +0 -0
  81. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nodeChannel.d.ts +0 -0
  82. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/nodeChannel.js +0 -0
  83. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/package.json +0 -0
  84. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/src/channel.ts +0 -0
  85. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/vscodeHost.d.ts +0 -0
  86. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/client/vscodeHost.js +0 -0
  87. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
  88. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
  89. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
  90. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
  91. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
  92. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
  93. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
  94. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
  95. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
  96. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
  97. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
  98. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
  99. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
  100. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
  101. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
  102. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
  103. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/computer_use.rs +0 -0
  104. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/src/lib.rs +0 -0
  105. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
  106. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
  107. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
  108. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
  109. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
  110. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
  111. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
  112. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/build.rs +0 -0
  113. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/lib.rs +0 -0
  114. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/main.rs +0 -0
  115. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/src/permission_guide.m +0 -0
  116. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/host/windows.rc +0 -0
  117. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/PROMPT.md +0 -0
  118. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.icns +0 -0
  119. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.ico +0 -0
  120. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/icons/icon.png +0 -0
  121. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/build-icons.mjs +0 -0
  122. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/build.mjs +0 -0
  123. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/check-wheel.py +0 -0
  124. {crabcode-0.1.7 → crabcode-0.1.8}/packages/computer-use/scripts/live-smoke.py +0 -0
  125. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/__init__.py +0 -0
  126. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/_windows_process.py +0 -0
  127. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/agent_manager.py +0 -0
  128. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/__init__.py +0 -0
  129. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/error_logging.py +0 -0
  130. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/gemini_adapter.py +0 -0
  131. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/model_info.py +0 -0
  132. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/ollama_adapter.py +0 -0
  133. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/api/registry.py +0 -0
  134. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/command_line.py +0 -0
  135. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/__init__.py +0 -0
  136. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/compact.py +0 -0
  137. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
  138. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/computer_use_mode.py +0 -0
  139. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/computer_use_observation.py +0 -0
  140. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/__init__.py +0 -0
  141. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/claudemd.py +0 -0
  142. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/manager.py +0 -0
  143. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/config/model_catalog.py +0 -0
  144. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/events.py +0 -0
  145. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/file_lock.py +0 -0
  146. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/filesystem.py +0 -0
  147. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/goal.py +0 -0
  148. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/hooks/__init__.py +0 -0
  149. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/hooks/manager.py +0 -0
  150. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/image_io.py +0 -0
  151. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/io_worker.py +0 -0
  152. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/logging_utils.py +0 -0
  153. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/__init__.py +0 -0
  154. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/client.py +0 -0
  155. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
  156. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/lsp/manager.py +0 -0
  157. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/__init__.py +0 -0
  158. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/client.py +0 -0
  159. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/mcp/config.py +0 -0
  160. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/path_validation.py +0 -0
  161. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/paths.py +0 -0
  162. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/peer/__init__.py +0 -0
  163. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/peer/runtime.py +0 -0
  164. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/__init__.py +0 -0
  165. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
  166. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/permissions/manager.py +0 -0
  167. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/__init__.py +0 -0
  168. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/executor.py +0 -0
  169. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/plan/types.py +0 -0
  170. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/__init__.py +0 -0
  171. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/blocks.py +0 -0
  172. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/context.py +0 -0
  173. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/library.py +0 -0
  174. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/profile.py +0 -0
  175. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/system.py +0 -0
  176. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/prompts/templates.py +0 -0
  177. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/__init__.py +0 -0
  178. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
  179. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/loop.py +0 -0
  180. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/query/retry.py +0 -0
  181. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/__init__.py +0 -0
  182. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/manager.py +0 -0
  183. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/models.py +0 -0
  184. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/store.py +0 -0
  185. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/schedule/timing.py +0 -0
  186. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/__init__.py +0 -0
  187. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/export.py +0 -0
  188. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/meta_db.py +0 -0
  189. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/storage.py +0 -0
  190. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/session/title_gen.py +0 -0
  191. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/__init__.py +0 -0
  192. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/context.py +0 -0
  193. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/loader.py +0 -0
  194. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/skills/matcher.py +0 -0
  195. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
  196. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
  197. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
  198. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/subprocess_utils.py +0 -0
  199. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/__init__.py +0 -0
  200. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/bridge.py +0 -0
  201. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/inbox.py +0 -0
  202. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/manager.py +0 -0
  203. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/message_bus.py +0 -0
  204. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/models.py +0 -0
  205. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/team/recovery.py +0 -0
  206. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/text_io.py +0 -0
  207. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/__init__.py +0 -0
  208. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
  209. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
  210. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/agent.py +0 -0
  211. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
  212. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/ask_user.py +0 -0
  213. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/bash.py +0 -0
  214. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/browser.py +0 -0
  215. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/checklist.py +0 -0
  216. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
  217. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/computer_use.py +0 -0
  218. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
  219. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_edit.py +0 -0
  220. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_read.py +0 -0
  221. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/file_write.py +0 -0
  222. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/glob.py +0 -0
  223. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/goal.py +0 -0
  224. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/grep.py +0 -0
  225. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/image.py +0 -0
  226. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/image_generate.py +0 -0
  227. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/lint.py +0 -0
  228. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/loading.py +0 -0
  229. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/memory.py +0 -0
  230. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/monitor.py +0 -0
  231. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/peer.py +0 -0
  232. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/revert.py +0 -0
  233. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/schedule.py +0 -0
  234. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/skill.py +0 -0
  235. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
  236. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/team.py +0 -0
  237. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/tool_search.py +0 -0
  238. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/tools/web_search.py +0 -0
  239. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/turn_details.py +0 -0
  240. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/__init__.py +0 -0
  241. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/config.py +0 -0
  242. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/event.py +0 -0
  243. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/message.py +0 -0
  244. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/types/tool.py +0 -0
  245. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/usage.py +0 -0
  246. {crabcode-0.1.7 → crabcode-0.1.8}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
  247. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/__init__.py +0 -0
  248. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/adapters.py +0 -0
  249. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/dap.py +0 -0
  250. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/memory.py +0 -0
  251. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/process.py +0 -0
  252. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/runtime.py +0 -0
  253. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/sessions.py +0 -0
  254. {crabcode-0.1.7 → crabcode-0.1.8}/packages/debugger/crabcode_debugger/tool.py +0 -0
  255. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/README.md +0 -0
  256. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/THEMES.md +0 -0
  257. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/index.html +0 -0
  258. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.startup.test.tsx +0 -0
  259. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.test.tsx +0 -0
  260. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/App.tsx +0 -0
  261. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ApprovalShortcutSettings.tsx +0 -0
  262. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReview.test.tsx +0 -0
  263. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReview.tsx +0 -0
  264. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
  265. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ChangeReviewControls.tsx +0 -0
  266. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
  267. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ComposerEditor.tsx +0 -0
  268. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
  269. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ConversationTurns.tsx +0 -0
  270. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/CopyButton.tsx +0 -0
  271. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentViewTabs.tsx +0 -0
  272. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
  273. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.files.test.tsx +0 -0
  274. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
  275. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
  276. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
  277. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/DocumentWorkspace.tsx +0 -0
  278. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
  279. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FileEditSummaryCard.tsx +0 -0
  280. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
  281. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/FollowUpQueue.tsx +0 -0
  282. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ModelSettingsPanel.test.tsx +0 -0
  283. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
  284. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
  285. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ProjectFilesWorkspace.tsx +0 -0
  286. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PromptSettingsPanel.test.tsx +0 -0
  287. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/PromptSettingsPanel.tsx +0 -0
  288. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/ReviewMenu.tsx +0 -0
  289. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/RuntimeSettingsPanel.tsx +0 -0
  290. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SettingsView.test.tsx +0 -0
  291. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SettingsView.tsx +0 -0
  292. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
  293. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
  294. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/StatusBar.test.tsx +0 -0
  295. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/StatusBar.tsx +0 -0
  296. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TrajectoryView.test.tsx +0 -0
  297. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TrajectoryView.tsx +0 -0
  298. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
  299. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/TurnDetailsButton.tsx +0 -0
  300. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.css +0 -0
  301. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
  302. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/UsageSettingsPanel.tsx +0 -0
  303. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
  304. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/VirtualMachineSettings.tsx +0 -0
  305. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
  306. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/approvalShortcuts.ts +0 -0
  307. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/computerUse.test.ts +0 -0
  308. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/computerUse.ts +0 -0
  309. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
  310. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/desktopSlashCommands.ts +0 -0
  311. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/diffRows.ts +0 -0
  312. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/events.test.ts +0 -0
  313. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/events.ts +0 -0
  314. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/favorites.test.ts +0 -0
  315. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/favorites.ts +0 -0
  316. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/fileEditSummary.test.ts +0 -0
  317. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/fileEditSummary.ts +0 -0
  318. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gateway.test.ts +0 -0
  319. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gateway.ts +0 -0
  320. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayErrors.test.ts +0 -0
  321. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayStartup.test.ts +0 -0
  322. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/gatewayStartup.ts +0 -0
  323. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/i18n.ts +0 -0
  324. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
  325. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/lumeInstaller.ts +0 -0
  326. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/main.tsx +0 -0
  327. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/markdownMath.ts +0 -0
  328. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.lume.test.ts +0 -0
  329. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.startup.test.ts +0 -0
  330. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.test.ts +0 -0
  331. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/native.ts +0 -0
  332. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/pathUtils.ts +0 -0
  333. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/permissionPresentation.ts +0 -0
  334. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/platform.ts +0 -0
  335. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
  336. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/promptTemplateFile.ts +0 -0
  337. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/reviewHistory.ts +0 -0
  338. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/sessionNotifications.test.ts +0 -0
  339. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/sessionNotifications.ts +0 -0
  340. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/styles.css +0 -0
  341. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/taskbarProgress.test.ts +0 -0
  342. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/taskbarProgress.ts +0 -0
  343. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/theme.test.ts +0 -0
  344. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/theme.ts +0 -0
  345. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/themePackages.test.ts +0 -0
  346. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/themePackages.ts +0 -0
  347. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/toolPresentation.test.ts +0 -0
  348. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/toolPresentation.ts +0 -0
  349. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/turnDetails.ts +0 -0
  350. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useGitReview.test.tsx +0 -0
  351. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useGitReview.ts +0 -0
  352. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useProjectModels.test.tsx +0 -0
  353. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/useProjectModels.ts +0 -0
  354. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
  355. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/userPromptDisplay.ts +0 -0
  356. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/uuid.test.ts +0 -0
  357. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/uuid.ts +0 -0
  358. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/virtualMachine.ts +0 -0
  359. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src/vite-env.d.ts +0 -0
  360. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/build.rs +0 -0
  361. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/capabilities/default.json +0 -0
  362. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/128x128.png +0 -0
  363. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
  364. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/32x32.png +0 -0
  365. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.icns +0 -0
  366. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.ico +0 -0
  367. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/icons/icon.png +0 -0
  368. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
  369. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
  370. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/gateway.rs +0 -0
  371. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
  372. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/lib.rs +0 -0
  373. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/main.rs +0 -0
  374. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/paths.rs +0 -0
  375. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/settings.rs +0 -0
  376. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
  377. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
  378. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
  379. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
  380. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
  381. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/tsconfig.json +0 -0
  382. {crabcode-0.1.7 → crabcode-0.1.8}/packages/desktop/vite.config.ts +0 -0
  383. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/__init__.py +0 -0
  384. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
  385. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
  386. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
  387. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
  388. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
  389. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/adapter.py +0 -0
  390. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/auth.py +0 -0
  391. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
  392. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
  393. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
  394. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
  395. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
  396. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
  397. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
  398. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
  399. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
  400. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/middleware.py +0 -0
  401. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/protocol.py +0 -0
  402. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
  403. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
  404. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
  405. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
  406. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
  407. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
  408. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
  409. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
  410. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
  411. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
  412. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
  413. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
  414. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
  415. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
  416. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
  417. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
  418. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
  419. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
  420. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/server.py +0 -0
  421. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
  422. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
  423. {crabcode-0.1.7 → crabcode-0.1.8}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
  424. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/__init__.py +0 -0
  425. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/background.py +0 -0
  426. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/chunker.py +0 -0
  427. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/embedder.py +0 -0
  428. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/indexer.py +0 -0
  429. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/store.py +0 -0
  430. {crabcode-0.1.7 → crabcode-0.1.8}/packages/search/crabcode_search/tool.py +0 -0
  431. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/README.md +0 -0
  432. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/index.d.ts +0 -0
  433. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/index.js +0 -0
  434. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/metadata.d.ts +0 -0
  435. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/metadata.js +0 -0
  436. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/runtime.js +0 -0
  437. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/i18n/runtime.test.mjs +0 -0
  438. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/package.json +0 -0
  439. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/slashCommands.d.ts +0 -0
  440. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/slashCommands.js +0 -0
  441. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/turnProcess.d.ts +0 -0
  442. {crabcode-0.1.7 → crabcode-0.1.8}/packages/shared/turnProcess.js +0 -0
  443. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.gitignore +0 -0
  444. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.nvmrc +0 -0
  445. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscode/launch.json +0 -0
  446. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscode/tasks.json +0 -0
  447. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/.vscodeignore +0 -0
  448. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/CHANGELOG.md +0 -0
  449. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/LICENSE +0 -0
  450. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/.vscodeignore +0 -0
  451. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/LICENSE +0 -0
  452. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/README.md +0 -0
  453. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/esbuild.cjs +0 -0
  454. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/extension.js +0 -0
  455. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.de.json +0 -0
  456. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.es.json +0 -0
  457. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.fr.json +0 -0
  458. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ja.json +0 -0
  459. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.json +0 -0
  460. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ko.json +0 -0
  461. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.pt-br.json +0 -0
  462. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.ru.json +0 -0
  463. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.zh-cn.json +0 -0
  464. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/computer-use/package.nls.zh-tw.json +0 -0
  465. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/esbuild.js +0 -0
  466. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/logo.png +0 -0
  467. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.de.json +0 -0
  468. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.es.json +0 -0
  469. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.fr.json +0 -0
  470. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ja.json +0 -0
  471. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.json +0 -0
  472. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ko.json +0 -0
  473. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.pt-br.json +0 -0
  474. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.ru.json +0 -0
  475. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.zh-cn.json +0 -0
  476. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/package.nls.zh-tw.json +0 -0
  477. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/resources/icon.svg +0 -0
  478. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/scripts/gen-types.py +0 -0
  479. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/chatPanel.ts +0 -0
  480. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/permissionPresentation.ts +0 -0
  481. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/client/protocol.ts +0 -0
  482. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/computerUse.ts +0 -0
  483. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/connection.ts +0 -0
  484. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/crabCodeSettingsPanel.ts +0 -0
  485. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/extension.ts +0 -0
  486. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/i18n.ts +0 -0
  487. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/ideContext.ts +0 -0
  488. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/pendingEdits.ts +0 -0
  489. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/promptTemplateFile.ts +0 -0
  490. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/runtimeControls.ts +0 -0
  491. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/catalog.ts +0 -0
  492. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/protocol.ts +0 -0
  493. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/src/settings/webview.css +0 -0
  494. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseController.test.cjs +0 -0
  495. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
  496. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUseNative.test.cjs +0 -0
  497. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
  498. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/contextUsage.test.cjs +0 -0
  499. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/followUp.test.cjs +0 -0
  500. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
  501. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/i18n.cjs +0 -0
  502. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/settingsHarness.cjs +0 -0
  503. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
  504. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
  505. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/i18n.test.cjs +0 -0
  506. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/ideContext.test.cjs +0 -0
  507. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/imageCaptions.test.cjs +0 -0
  508. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/permissionPolicy.test.cjs +0 -0
  509. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
  510. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/slashCommands.test.cjs +0 -0
  511. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/streamRetry.test.cjs +0 -0
  512. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/turnDetails.test.cjs +0 -0
  513. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tests/turnProcess.test.cjs +0 -0
  514. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tsconfig.json +0 -0
  515. {crabcode-0.1.7 → crabcode-0.1.8}/packages/vscode/tsconfig.webview.json +0 -0
  516. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/audit_tool_cards.mjs +0 -0
  517. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/build_document_engine_bundle.py +0 -0
  518. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/i18n.mjs +0 -0
  519. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/package_clients.py +0 -0
  520. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/prompt_budget.py +0 -0
  521. {crabcode-0.1.7 → crabcode-0.1.8}/scripts/sync_version.py +0 -0
  522. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_api_error_logging.py +0 -0
  523. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_apply_patch.py +0 -0
  524. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_api_recovery.py +0 -0
  525. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_composer.py +0 -0
  526. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_computer_use.py +0 -0
  527. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_model_management.py +0 -0
  528. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_model_picker.py +0 -0
  529. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_session_picker.py +0 -0
  530. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_cli_yolo.py +0 -0
  531. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_client_packaging.py +0 -0
  532. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_codex_context_window.py +0 -0
  533. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_compact_prompt.py +0 -0
  534. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_compaction_settings.py +0 -0
  535. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use.py +0 -0
  536. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_ax.py +0 -0
  537. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_history.py +0 -0
  538. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_observation.py +0 -0
  539. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_packaging.py +0 -0
  540. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_policy.py +0 -0
  541. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_computer_use_window_observations.py +0 -0
  542. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_config_home.py +0 -0
  543. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_context_token_accounting.py +0 -0
  544. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_follow_up_messages.py +0 -0
  545. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_new_session_controls.py +0 -0
  546. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_runtime_info.py +0 -0
  547. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_gateway_send_message.py +0 -0
  548. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_git_review.py +0 -0
  549. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_image_context.py +0 -0
  550. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_image_tool.py +0 -0
  551. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_io_isolation.py +0 -0
  552. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_connection.py +0 -0
  553. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_info.py +0 -0
  554. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_model_settings_delete.py +0 -0
  555. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_network_policy.py +0 -0
  556. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_openai_tool_images.py +0 -0
  557. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_permission_policy_status.py +0 -0
  558. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_project_model_catalog.py +0 -0
  559. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_prompt_loading.py +0 -0
  560. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_prompt_settings.py +0 -0
  561. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_read_images.py +0 -0
  562. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_reasoning_effort.py +0 -0
  563. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_resume_model.py +0 -0
  564. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_session_storage_performance.py +0 -0
  565. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_stream_reconnect.py +0 -0
  566. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_tool_loading.py +0 -0
  567. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_turn_details.py +0 -0
  568. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_usage.py +0 -0
  569. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_web_search.py +0 -0
  570. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_windows_audit_regressions.py +0 -0
  571. {crabcode-0.1.7 → crabcode-0.1.8}/tests/test_windows_compat.py +0 -0
@@ -32,6 +32,7 @@ jobs:
32
32
  - run: python -m pip install -e . fastapi pypdf python-multipart pytest
33
33
  - run: python -m unittest discover -s tests -p "test_windows*.py" -v
34
34
  - run: python -m pytest tests/test_cli_computer_use.py -q
35
+ - run: python -m pytest tests/test_sdk_transport_compat.py tests/test_network_policy.py -q
35
36
 
36
37
  windows-clients:
37
38
  runs-on: windows-latest
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crabcode
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: CrabCode - AI coding assistant in the terminal
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: anthropic>=0.40.0
@@ -580,6 +580,8 @@ For DeepSeek V4 thinking mode with tool calls, enable reasoning pass-through:
580
580
 
581
581
  CrabCode automatically manages the context window to prevent `400 token limit exceeded` errors.
582
582
 
583
+ When importing new models with **Get model list** on a configuration group in Desktop or VS Code, CrabCode saves context and output limits supplied by `/models`. It recognizes Anthropic's `max_input_tokens` / `max_tokens`, OpenRouter's `context_length` / `top_provider.max_completion_tokens`, and common compatible API limit fields, using the smaller limit when several are present. Explicit thinking capability metadata configures the thinking switch; Anthropic thinking budgets are kept below the output limit. Explicit group context overrides, smaller output budgets, and disabled thinking are preserved. Existing model profiles are untouched, and missing metadata continues to inherit settings or use runtime defaults. Temperature, reasoning effort, prices, and image/tool capabilities are not inferred from model names or automatically changed.
584
+
583
585
  **How context window size is resolved** (in priority order):
584
586
 
585
587
  1. `context_window` field in your `api` config (explicit override)
@@ -569,6 +569,8 @@ DeepSeek V4 思考模式配合工具调用时,需要开启 reasoning 回传:
569
569
 
570
570
  CrabCode 会自动管理上下文窗口,防止因 token 超限导致 `400` 报错。
571
571
 
572
+ 在 Desktop 或 VS Code 的模型设置中,从配置组「获取模型列表」并导入新模型时,会自动保存 `/models` 返回的上下文窗口和最大输出 token 数。支持 Anthropic 的 `max_input_tokens` / `max_tokens`、OpenRouter 的 `context_length` / `top_provider.max_completion_tokens`,以及兼容接口的常见限制字段;有多项限制时取较小值。接口明确提供思考能力时会设置思考开关,Anthropic 的思考预算也会限制在输出上限以内。配置组中手动指定的上下文窗口、较小的输出预算和关闭思考的偏好会保留;已有模型不会被覆盖,接口未提供的字段继续继承配置或使用运行时默认值。温度、思考强度、价格和图像/工具能力不会根据模型名称推测或自动改写。
573
+
572
574
  **上下文窗口大小的解析优先级:**
573
575
 
574
576
  1. `api` 配置中显式指定的 `context_window` 字段
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "crabcode-cli"
3
3
  # Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
4
- version = "0.1.7"
4
+ version = "0.1.8"
5
5
  description = "CrabCode CLI - terminal frontend for CrabCode"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
- "crabcode-core>=0.1.7",
8
+ "crabcode-core>=0.1.8",
9
9
  "typer>=0.12.0",
10
10
  "rich>=13.0.0",
11
11
  "prompt-toolkit>=3.0.0",
@@ -402,7 +402,7 @@ dependencies = [
402
402
 
403
403
  [[package]]
404
404
  name = "crabcode-computer-use-core"
405
- version = "0.1.7"
405
+ version = "0.1.8"
406
406
  dependencies = [
407
407
  "base64",
408
408
  "core-foundation",
@@ -423,7 +423,7 @@ dependencies = [
423
423
 
424
424
  [[package]]
425
425
  name = "crabcode-computer-use-host"
426
- version = "0.1.7"
426
+ version = "0.1.8"
427
427
  dependencies = [
428
428
  "cc",
429
429
  "crabcode-computer-use-core",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "crabcode-computer-use-core"
3
- version = "0.1.7"
3
+ version = "0.1.8"
4
4
  edition = "2021"
5
5
  description = "CrabCode native Computer Use engine shared by all clients"
6
6
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "crabcode-computer-use-host"
3
- version = "0.1.7"
3
+ version = "0.1.8"
4
4
  edition = "2021"
5
5
 
6
6
  [[bin]]
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for the CrabCode release version."""
2
2
 
3
- VERSION = "0.1.7"
3
+ VERSION = "0.1.8"
@@ -123,6 +123,7 @@ def _tools_to_api(tools: list[dict[str, Any]]) -> list[dict[str, Any]]:
123
123
  class AnthropicAdapter(APIAdapter):
124
124
  """Adapter for Anthropic's Messages API (direct, first-party)."""
125
125
 
126
+ _sdk = anthropic
126
127
  emits_response_item_events = True
127
128
 
128
129
  def __init__(self, config: ApiConfig):
@@ -143,7 +144,7 @@ class AnthropicAdapter(APIAdapter):
143
144
  kwargs["default_headers"] = config.http_headers
144
145
 
145
146
  from crabcode_core.api.network import sdk_options
146
- self.client = anthropic.AsyncAnthropic(**kwargs, **sdk_options(config))
147
+ self.client = anthropic.AsyncAnthropic(**kwargs, **sdk_options(config, self._sdk))
147
148
  self._api_key = api_key
148
149
 
149
150
  def _messages_url(self) -> str | None:
@@ -632,7 +633,7 @@ class BedrockAdapter(AnthropicAdapter):
632
633
  def __init__(self, config: ApiConfig):
633
634
  self.config = config
634
635
  from crabcode_core.api.network import sdk_options
635
- self.client = anthropic.AsyncAnthropicBedrock(**sdk_options(config))
636
+ self.client = anthropic.AsyncAnthropicBedrock(**sdk_options(config, self._sdk))
636
637
 
637
638
 
638
639
  class VertexAdapter(AnthropicAdapter):
@@ -644,5 +645,5 @@ class VertexAdapter(AnthropicAdapter):
644
645
  self.client = anthropic.AsyncAnthropicVertex(
645
646
  region=os.environ.get("CLOUD_ML_REGION", "us-east5"),
646
647
  project_id=os.environ.get("ANTHROPIC_VERTEX_PROJECT_ID"),
647
- **sdk_options(config),
648
+ **sdk_options(config, self._sdk),
648
649
  )
@@ -57,7 +57,7 @@ class AzureOpenAIAdapter(OpenAIAdapter):
57
57
  kwargs["default_headers"] = config.http_headers
58
58
 
59
59
  from crabcode_core.api.network import sdk_options
60
- return openai.AsyncAzureOpenAI(**kwargs, **sdk_options(config))
60
+ return openai.AsyncAzureOpenAI(**kwargs, **sdk_options(config, self._sdk))
61
61
 
62
62
  def _resolve_model(self, config: ModelConfig) -> str:
63
63
  """Azure uses deployment names instead of model names."""
@@ -188,13 +188,13 @@ class APIAdapter(ABC):
188
188
  async def reset_network_client(self) -> None:
189
189
  """Replace a failed SDK connection pool without changing its routing policy."""
190
190
  import asyncio
191
- from crabcode_core.api.network import http_options, request_timeout
191
+ from crabcode_core.api.network import sdk_http_client
192
192
 
193
193
  client = getattr(self, "client", None)
194
194
  copy = getattr(client, "with_options", None)
195
195
  if not callable(copy):
196
196
  return
197
- transport = httpx.AsyncClient(timeout=request_timeout(self.config), **http_options(self.config))
197
+ transport = sdk_http_client(self.config, getattr(self, "_sdk", None))
198
198
  try:
199
199
  replacement = copy(http_client=transport, max_retries=0)
200
200
  except BaseException:
@@ -486,6 +486,7 @@ class CodexAdapter(APIAdapter):
486
486
  def __init__(self, config: ApiConfig):
487
487
  import openai
488
488
 
489
+ self._sdk = openai
489
490
  self.config = config
490
491
  api_key = None
491
492
  oauth_account_id = None
@@ -524,7 +525,7 @@ class CodexAdapter(APIAdapter):
524
525
  # differing built-in policy (which also retries 429) and apply the
525
526
  # configured policy explicitly in _create_sdk_response_stream().
526
527
  from crabcode_core.api.network import sdk_options
527
- kwargs.update(sdk_options(config))
528
+ kwargs.update(sdk_options(config, self._sdk))
528
529
  self.client = openai.AsyncOpenAI(**kwargs)
529
530
 
530
531
  async def resolve_context_window(self) -> int:
@@ -6,6 +6,7 @@ import asyncio
6
6
  import json
7
7
  import os
8
8
  from collections.abc import Mapping
9
+ from typing import Any
9
10
  from urllib.parse import urlsplit, urlunsplit
10
11
 
11
12
  import httpx
@@ -18,6 +19,63 @@ class ModelDiscoveryError(ValueError):
18
19
  """A safe, user-facing discovery error (never a raw provider response)."""
19
20
 
20
21
 
22
+ def _token_limit(*values: Any) -> int | None:
23
+ # Metadata is optional: ignore malformed values without losing the catalog.
24
+ limits = [value for value in values if type(value) is int and 0 < value <= 2_147_483_647]
25
+ return min(limits) if limits else None
26
+
27
+
28
+ def _model_metadata(entry: Mapping[str, Any]) -> dict[str, Any]:
29
+ """Normalize explicit limits; never guess capabilities from a model name."""
30
+ # https://platform.claude.com/docs/en/api/models/list
31
+ # https://openrouter.ai/docs/api/api-reference/models/list-all-models-and-their-properties
32
+ top = entry.get("top_provider")
33
+ top = top if isinstance(top, dict) else {}
34
+ result: dict[str, Any] = {}
35
+ context = _token_limit(*(entry.get(key) for key in (
36
+ "context_length", "context_window", "max_context_length", "max_model_len", "max_input_tokens",
37
+ )), top.get("context_length"))
38
+ output = _token_limit(*(entry.get(key) for key in (
39
+ "max_output_tokens", "max_completion_tokens", "max_tokens",
40
+ )), top.get("max_completion_tokens"))
41
+ if context is not None:
42
+ result["context_window"] = context
43
+ if output is not None:
44
+ result["max_tokens"] = output
45
+ capabilities = entry.get("capabilities")
46
+ thinking = capabilities.get("thinking") if isinstance(capabilities, dict) else None
47
+ supported = thinking.get("supported") if isinstance(thinking, dict) else None
48
+ if type(supported) is bool:
49
+ result["thinking_enabled"] = supported
50
+ return result
51
+
52
+
53
+ def model_import_config(metadata: Mapping[str, Any], group: ApiConfig) -> dict[str, Any]:
54
+ """Apply only supported settings, retaining explicit group preferences."""
55
+ result: dict[str, Any] = {}
56
+ context = _token_limit(metadata.get("context_window"))
57
+ if context is not None and group.context_window is None:
58
+ result["context_window"] = context
59
+ output = _token_limit(metadata.get("max_tokens"))
60
+ if output is not None:
61
+ # A deliberately smaller output budget stays in force. Otherwise use
62
+ # the published model limit instead of the generic 16k default.
63
+ result["max_tokens"] = min(output, group.max_tokens) if "max_tokens" in group.model_fields_set else output
64
+ thinking = metadata.get("thinking_enabled")
65
+ if type(thinking) is bool:
66
+ result["thinking_enabled"] = thinking and group.thinking_enabled
67
+ protocol = (group.format or "openai") if group.provider == "router" else (group.provider or "anthropic")
68
+ if protocol == "anthropic" and output is not None and result.get("thinking_enabled", group.thinking_enabled):
69
+ # Anthropic budgeted thinking requires at least 1024 tokens, strictly
70
+ # below max_tokens. Importing a smaller limit must not break requests.
71
+ budget = min(group.thinking_budget, result["max_tokens"] - 1)
72
+ if budget < 1024:
73
+ result["thinking_enabled"] = False
74
+ elif budget != group.thinking_budget:
75
+ result["thinking_budget"] = budget
76
+ return result
77
+
78
+
21
79
  def _connection(config: ApiConfig, env: Mapping[str, str]) -> tuple[str, httpx.Headers, bool]:
22
80
  provider = config.provider or "anthropic"
23
81
  protocol = (config.format or "openai") if provider == "router" else provider
@@ -63,9 +121,9 @@ def _connection(config: ApiConfig, env: Mapping[str, str]) -> tuple[str, httpx.H
63
121
  return endpoint, headers, anthropic
64
122
 
65
123
 
66
- async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, str]]:
124
+ async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, Any]]:
67
125
  endpoint, headers, anthropic = _connection(config, env)
68
- models: dict[str, dict[str, str]] = {}
126
+ models: dict[str, dict[str, Any]] = {}
69
127
  cursors: set[str] = set()
70
128
  params: dict[str, str | int] = {"limit": 1000} if anthropic else {}
71
129
  remaining_bytes = 4 * 1024 * 1024
@@ -93,10 +151,13 @@ async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, st
93
151
  if not isinstance(model_id, str) or not model_id.strip() or len(model_id) > 512 or any(ord(char) < 32 for char in model_id):
94
152
  raise ModelDiscoveryError("模型列表包含无效的模型 ID,请检查服务端响应")
95
153
  model_id = model_id.strip()
96
- model = {"id": model_id}
97
- display_name = entry.get("display_name")
154
+ model: dict[str, Any] = {"id": model_id}
155
+ display_name = entry.get("display_name") or entry.get("name")
98
156
  if isinstance(display_name, str) and display_name.strip():
99
157
  model["name"] = display_name.strip()[:512]
158
+ settings = model_import_config(_model_metadata(entry), config)
159
+ if settings:
160
+ model["config"] = settings
100
161
  models.setdefault(model_id, model)
101
162
  if len(models) > 5000:
102
163
  raise ModelDiscoveryError("模型列表过大,请缩小服务端返回范围后重试")
@@ -110,7 +171,7 @@ async def _fetch(config: ApiConfig, env: Mapping[str, str]) -> list[dict[str, st
110
171
  raise ModelDiscoveryError("模型列表分页过多,请缩小服务端返回范围后重试")
111
172
 
112
173
 
113
- async def discover_models(config: ApiConfig, settings_env: Mapping[str, str] | None = None) -> list[dict[str, str]]:
174
+ async def discover_models(config: ApiConfig, settings_env: Mapping[str, str] | None = None) -> list[dict[str, Any]]:
114
175
  try:
115
176
  # Match session initialization's setdefault precedence without mutating
116
177
  # the Gateway environment or requiring an initialized chat session.
@@ -26,17 +26,24 @@ def http_options(config: Any) -> dict[str, Any]:
26
26
  return {"trust_env": False, "proxy": proxy}
27
27
 
28
28
 
29
- def request_timeout(config: Any) -> httpx.Timeout:
29
+ def request_timeout(config: Any, sdk: Any = None) -> Any:
30
30
  timeout = float(getattr(config, "timeout", 300))
31
- return httpx.Timeout(timeout, connect=min(timeout, 10.0))
31
+ # SDK exports follow their supported transport (httpx or httpx2).
32
+ timeout_type = sdk.Timeout if sdk is not None else httpx.Timeout
33
+ return timeout_type(timeout, connect=min(timeout, 10.0))
32
34
 
33
35
 
34
- def sdk_options(config: Any) -> dict[str, Any]:
36
+ def sdk_http_client(config: Any, sdk: Any = None) -> Any:
37
+ client_type = sdk.DefaultAsyncHttpxClient if sdk is not None else httpx.AsyncClient
38
+ return client_type(**http_options(config), timeout=request_timeout(config, sdk))
39
+
40
+
41
+ def sdk_options(config: Any, sdk: Any) -> dict[str, Any]:
35
42
  # The query loop owns retry budgets; nested SDK retries hide progress.
36
- options: dict[str, Any] = {"max_retries": 0, "timeout": request_timeout(config)}
43
+ options: dict[str, Any] = {"max_retries": 0, "timeout": request_timeout(config, sdk)}
37
44
  routing = http_options(config)
38
45
  if routing:
39
- options["http_client"] = httpx.AsyncClient(**routing, timeout=request_timeout(config))
46
+ options["http_client"] = sdk_http_client(config, sdk)
40
47
  return options
41
48
 
42
49
 
@@ -168,6 +168,9 @@ class OpenAIAdapter(APIAdapter):
168
168
  """
169
169
 
170
170
  def __init__(self, config: ApiConfig):
171
+ import openai
172
+
173
+ self._sdk = openai
171
174
  self.config = config
172
175
  self.client = self._create_client(config)
173
176
 
@@ -190,7 +193,7 @@ class OpenAIAdapter(APIAdapter):
190
193
  kwargs["default_headers"] = config.http_headers
191
194
 
192
195
  from crabcode_core.api.network import sdk_options
193
- return openai.AsyncOpenAI(**kwargs, **sdk_options(config))
196
+ return openai.AsyncOpenAI(**kwargs, **sdk_options(config, self._sdk))
194
197
 
195
198
  def _resolve_model(self, config: ModelConfig) -> str:
196
199
  """Resolve the model name for the API call. Override in subclasses."""
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "crabcode-core"
3
3
  # Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
4
- version = "0.1.7"
4
+ version = "0.1.8"
5
5
  description = "CrabCode core library - AI coding assistant engine"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
@@ -5,11 +5,11 @@ build-backend = "hatchling.build"
5
5
  [project]
6
6
  name = "crabcode-debugger"
7
7
  # Synced from packages/core/crabcode_core/_version.py by scripts/sync_version.py.
8
- version = "0.1.7"
8
+ version = "0.1.8"
9
9
  description = "DAP and process-level debugging tools for CrabCode"
10
10
  requires-python = ">=3.10"
11
11
  dependencies = [
12
- "crabcode-core>=0.1.7",
12
+ "crabcode-core>=0.1.8",
13
13
  ]
14
14
 
15
15
  [tool.hatch.build.targets.wheel]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "crabcode-desktop",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "crabcode-desktop",
9
- "version": "0.1.7",
9
+ "version": "0.1.8",
10
10
  "dependencies": {
11
11
  "@tauri-apps/api": "^2.8.0",
12
12
  "@tauri-apps/plugin-global-shortcut": "^2.3.2",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "crabcode-desktop",
3
3
  "private": true,
4
- "version": "0.1.7",
4
+ "version": "0.1.8",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "computer-use:build": "node ../computer-use/scripts/build.mjs --out src-tauri/resources/computer-use --sync-local-clients",
@@ -12,12 +12,13 @@ const data: ModelSettingsResponse = {
12
12
  editable_sources: [{ id: "userSettings", label: "用户配置", path: "/user/settings.json", exists: true, writable: true }],
13
13
  };
14
14
 
15
- it("opens discovery on the group and only imports selected new model IDs", async () => {
15
+ it("previews discovered settings and imports metadata only for selected new models", async () => {
16
16
  (globalThis as unknown as { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
17
17
  const container = document.createElement("div");
18
18
  document.body.append(container);
19
19
  const root = createRoot(container);
20
- const onDiscover = vi.fn(async () => ({ group: "shared", models: [{ id: "old" }, { id: "org/new" }, { id: "other" }] }));
20
+ const config = { context_window: 131072, max_tokens: 8192, thinking_enabled: false };
21
+ const onDiscover = vi.fn(async () => ({ group: "shared", models: [{ id: "old", config }, { id: "org/new", config }, { id: "other", config }] }));
21
22
  const onMutate = vi.fn().mockRejectedValueOnce(new Error("write failed")).mockResolvedValue(undefined);
22
23
  const props = { activeConnection: null, activeProject: null, gateway: { status: "online" } as GatewayViewState, data, loading: false, error: null, onRefresh: () => {}, onMutate, onDiscover };
23
24
  const click = async (text: string) => act(async () => [...container.querySelectorAll<HTMLButtonElement>("button")].find(button => button.textContent === text)!.click());
@@ -28,12 +29,15 @@ it("opens discovery on the group and only imports selected new model IDs", async
28
29
  expect(onDiscover).toHaveBeenCalledWith("shared");
29
30
  expect(container.querySelector<HTMLInputElement>('[aria-label="old"]')!.disabled).toBe(true);
30
31
  expect(onMutate).not.toHaveBeenCalled();
32
+ expect(container.textContent).toContain("上下文窗口: 131072");
33
+ expect(container.textContent).toContain("最大输出 Token: 8192");
34
+ expect(container.textContent).toContain("思考: 关闭");
31
35
  await act(async () => container.querySelector<HTMLInputElement>('[aria-label="org/new"]')!.click());
32
36
  await click("添加所选模型");
33
37
  expect(container.querySelector('[role="alert"]')?.textContent).toContain("write failed");
34
38
  expect(container.querySelector<HTMLInputElement>('[aria-label="org/new"]')!.checked).toBe(true);
35
39
  await click("添加所选模型");
36
- expect(onMutate).toHaveBeenLastCalledWith({ action: "import_group_models", name: "shared", source: "userSettings", cwd: undefined, model_ids: ["org/new"] });
40
+ expect(onMutate).toHaveBeenLastCalledWith({ action: "import_group_models", name: "shared", source: "userSettings", cwd: undefined, model_ids: ["org/new"], model_metadata: { "org/new": config } });
37
41
  expect(container.querySelector('[role="dialog"]')).toBeNull();
38
42
  } finally {
39
43
  await act(async () => root.unmount());
@@ -1,14 +1,14 @@
1
1
  import { useEffect, useRef, useState } from "react";
2
2
  import { Download, LoaderCircle, RefreshCw, X } from "lucide-react";
3
3
  import { t as tr } from "./i18n";
4
- import type { ModelDiscoveryResponse } from "./types";
4
+ import type { DiscoveredModelSettings, ModelDiscoveryResponse } from "./types";
5
5
 
6
6
  export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscover, onImport, onClose }: {
7
7
  group: string;
8
8
  sourceLabel: string;
9
9
  existingIds: Set<string>;
10
10
  onDiscover: (group: string) => Promise<ModelDiscoveryResponse>;
11
- onImport: (ids: string[]) => Promise<void>;
11
+ onImport: (ids: string[], metadata: Record<string, DiscoveredModelSettings>) => Promise<void>;
12
12
  onClose: () => void;
13
13
  }) {
14
14
  const [models, setModels] = useState<ModelDiscoveryResponse["models"] | null>(null);
@@ -46,7 +46,10 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
46
46
  setSaving(true);
47
47
  setError(null);
48
48
  try {
49
- await onImport(selectedIds);
49
+ const metadata = Object.fromEntries((models ?? [])
50
+ .filter(model => selectedIds.includes(model.id) && model.config)
51
+ .map(model => [model.id, model.config!]));
52
+ await onImport(selectedIds, metadata);
50
53
  onClose();
51
54
  } catch (reason) {
52
55
  setError(reason instanceof Error ? reason.message : String(reason));
@@ -66,6 +69,7 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
66
69
  </header>
67
70
  <div className="model-editor-body">
68
71
  <p className="model-discovery-description">{tr("选择要加入配置组的模型,已有模型会保留原配置。")}</p>
72
+ <p className="model-discovery-description">{tr("导入时自动填写接口提供的上下文、输出和思考设置;未提供的字段沿用现有配置。")}</p>
69
73
  <div className="model-discovery-toolbar">
70
74
  <input type="search" aria-label={tr("搜索模型")} placeholder={tr("搜索模型")} value={query} onChange={event => setQuery(event.target.value)} disabled={saving} autoFocus />
71
75
  <button type="button" className="settings-command" disabled={loading || saving} onClick={() => void refresh()}><RefreshCw />{tr("刷新")}</button>
@@ -95,7 +99,13 @@ export function GroupModelDiscovery({ group, sourceLabel, existingIds, onDiscove
95
99
  return next;
96
100
  });
97
101
  }} />
98
- <span><strong>{model.id}</strong>{model.name && model.name !== model.id && <small>{model.name}</small>}</span>
102
+ <span><strong>{model.id}</strong>{model.name && model.name !== model.id && <small>{model.name}</small>}
103
+ {model.config && <small>{[
104
+ model.config.context_window != null && `${tr("上下文窗口")}: ${model.config.context_window}`,
105
+ model.config.max_tokens != null && `${tr("最大输出 Token")}: ${model.config.max_tokens}`,
106
+ model.config.thinking_enabled != null && `${tr("思考")}: ${model.config.thinking_enabled ? tr("开启") : tr("关闭")}`,
107
+ ].filter(Boolean).join(" · ")}</small>}
108
+ </span>
99
109
  {existingIds.has(model.id) && <small>{tr("已添加")}</small>}
100
110
  </label>)}
101
111
  {!visible.length && <p className="settings-list-empty">{models.length ? tr("没有匹配的模型") : tr("接口未返回可用模型")}</p>}
@@ -807,7 +807,7 @@ export function ModelSettingsPanel({
807
807
  sourceLabel={sourceOptions.find(item => item.id === discovery.source)?.label ?? discovery.source}
808
808
  existingIds={new Set(data.models.filter(model => model.group === discovery.group).map(model => String(model.effective.model ?? "")))}
809
809
  onDiscover={onDiscover}
810
- onImport={model_ids => mutate({ action: "import_group_models", name: discovery.group, source: discovery.source, cwd: activeProject?.path, model_ids })}
810
+ onImport={(model_ids, model_metadata) => mutate({ action: "import_group_models", name: discovery.group, source: discovery.source, cwd: activeProject?.path, model_ids, model_metadata })}
811
811
  onClose={() => setDiscovery(null)}
812
812
  />
813
813
  )}
@@ -586,11 +586,19 @@ export interface ModelSettingsMutation {
586
586
  config?: Record<string, unknown>;
587
587
  remove_fields?: string[];
588
588
  model_ids?: string[];
589
+ model_metadata?: Record<string, DiscoveredModelSettings>;
590
+ }
591
+
592
+ export interface DiscoveredModelSettings {
593
+ context_window?: number | null;
594
+ max_tokens?: number | null;
595
+ thinking_enabled?: boolean | null;
596
+ thinking_budget?: number | null;
589
597
  }
590
598
 
591
599
  export interface ModelDiscoveryResponse {
592
600
  group: string;
593
- models: Array<{ id: string; name?: string }>;
601
+ models: Array<{ id: string; name?: string | null; config?: DiscoveredModelSettings | null }>;
594
602
  }
595
603
 
596
604
  export interface RuntimeSettingsResponse {
@@ -672,7 +672,7 @@ dependencies = [
672
672
 
673
673
  [[package]]
674
674
  name = "crabcode-computer-use-core"
675
- version = "0.1.7"
675
+ version = "0.1.8"
676
676
  dependencies = [
677
677
  "base64 0.22.1",
678
678
  "core-foundation 0.10.1",
@@ -692,7 +692,7 @@ dependencies = [
692
692
 
693
693
  [[package]]
694
694
  name = "crabcode-computer-use-host"
695
- version = "0.1.7"
695
+ version = "0.1.8"
696
696
  dependencies = [
697
697
  "cc",
698
698
  "crabcode-computer-use-core",
@@ -709,7 +709,7 @@ dependencies = [
709
709
 
710
710
  [[package]]
711
711
  name = "crabcode-desktop"
712
- version = "0.1.7"
712
+ version = "0.1.8"
713
713
  dependencies = [
714
714
  "base64 0.22.1",
715
715
  "crabcode-computer-use-core",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "crabcode-desktop"
3
- version = "0.1.7"
3
+ version = "0.1.8"
4
4
  description = "Desktop client for CrabCode Gateway"
5
5
  authors = ["CrabCode"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Crab Desktop",
4
- "version": "0.1.7",
4
+ "version": "0.1.8",
5
5
  "identifier": "io.crabcode.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run computer-use:build -- --debug && npm run dev",
@@ -29,6 +29,7 @@ from crabcode_gateway.schemas import (
29
29
  GoalRequest,
30
30
  GoalState,
31
31
  ModelInfo,
32
+ ModelDiscoveryResponse,
32
33
  ModelSettingsEntry,
33
34
  ModelSettingsMutationRequest,
34
35
  ModelSettingsResponse,
@@ -66,7 +67,7 @@ class GroupModelsRequest(BaseModel):
66
67
  cwd: str | None = None
67
68
 
68
69
 
69
- @router.post("/config/discover-models")
70
+ @router.post("/config/discover-models", response_model=ModelDiscoveryResponse, response_model_exclude_none=True)
70
71
  async def discover_group_models(req: GroupModelsRequest, request: Request) -> dict[str, Any]:
71
72
  from crabcode_core.api.model_discovery import ModelDiscoveryError, discover_models
72
73
 
@@ -316,7 +317,10 @@ def _redact_model_settings(value: Any, key: str = "") -> Any:
316
317
  """Keep useful configuration visible without echoing embedded credentials."""
317
318
  normalized_key = key.lower().replace("-", "_")
318
319
  is_reference = normalized_key.endswith("_env") or normalized_key.endswith("_path")
319
- if key and not is_reference and any(part in normalized_key for part in _SENSITIVE_CONFIG_KEYS):
320
+ is_token_count = type(value) is int and normalized_key in {
321
+ "max_tokens", "max_output_tokens", "max_completion_tokens", "budget_tokens", "compact_buffer_tokens",
322
+ }
323
+ if key and not is_reference and not is_token_count and any(part in normalized_key for part in _SENSITIVE_CONFIG_KEYS):
320
324
  return "[redacted]"
321
325
  if isinstance(value, dict):
322
326
  return {
@@ -626,11 +630,13 @@ def _mutate_model_settings(request: Request, req: ModelSettingsMutationRequest)
626
630
 
627
631
  if action == "import_group_models":
628
632
  import re
633
+ from crabcode_core.api.model_discovery import model_import_config
629
634
 
630
635
  name = _validate_model_settings_name(req.name)
631
636
  preview = _model_settings_from_files(cwd)
632
637
  if name not in preview.groups:
633
638
  raise HTTPException(status_code=404, detail="配置组不存在,请刷新模型目录")
639
+ group = ConfigManager(cwd=cwd).load().groups[name]
634
640
  models = current.setdefault("models", {})
635
641
  if not isinstance(models, dict):
636
642
  raise HTTPException(status_code=422, detail="models must be a JSON object")
@@ -654,7 +660,9 @@ def _mutate_model_settings(request: Request, req: ModelSettingsMutationRequest)
654
660
  tail = f" ({suffix})"
655
661
  candidate = stem[:120 - len(tail)] + tail
656
662
  suffix += 1
657
- models[candidate] = {"group": name, "model": model_id}
663
+ metadata = req.model_metadata.get(model_id)
664
+ settings = model_import_config(metadata.model_dump(exclude_none=True), group) if metadata else {}
665
+ models[candidate] = {"group": name, "model": model_id, **settings}
658
666
  used_names.add(candidate)
659
667
  elif action in {"upsert_model", "delete_model"}:
660
668
  name = _validate_model_settings_name(req.name)