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.
Files changed (598) hide show
  1. {crabcode-0.1.9 → crabcode-0.1.10}/CLIENT_PACKAGING.md +1 -1
  2. {crabcode-0.1.9 → crabcode-0.1.10}/PKG-INFO +1 -1
  3. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/pyproject.toml +2 -2
  4. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/Cargo.lock +2 -2
  5. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/Cargo.toml +1 -1
  6. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/Cargo.toml +1 -1
  7. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/_version.py +1 -1
  8. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/anthropic_adapter.py +48 -16
  9. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/azure_adapter.py +3 -4
  10. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/base.py +2 -2
  11. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/codex_adapter.py +12 -7
  12. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/gemini_adapter.py +2 -4
  13. crabcode-0.1.10/packages/core/crabcode_core/api/network.py +145 -0
  14. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/ollama_adapter.py +5 -4
  15. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/openai_adapter.py +62 -2
  16. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/config.py +1 -1
  17. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/pyproject.toml +1 -1
  18. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/pyproject.toml +2 -2
  19. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/package-lock.json +2 -2
  20. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/package.json +1 -1
  21. crabcode-0.1.10/packages/desktop/src/App.startup.test.tsx +165 -0
  22. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/App.tsx +154 -119
  23. crabcode-0.1.10/packages/desktop/src/ConnectionModal.test.tsx +97 -0
  24. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.files.test.tsx +7 -0
  25. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.tsx +8 -3
  26. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SettingsView.test.tsx +48 -2
  27. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SettingsView.tsx +10 -7
  28. crabcode-0.1.10/packages/desktop/src/WindowTitlebar.css +324 -0
  29. crabcode-0.1.10/packages/desktop/src/WindowTitlebar.test.tsx +108 -0
  30. crabcode-0.1.10/packages/desktop/src/WindowTitlebar.tsx +99 -0
  31. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/main.tsx +1 -0
  32. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/platform.ts +5 -0
  33. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/styles.css +19 -5
  34. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.lock +3 -3
  35. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/Cargo.toml +1 -1
  36. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/capabilities/default.json +4 -0
  37. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/lib.rs +15 -0
  38. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/tauri.conf.json +3 -1
  39. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/pyproject.toml +2 -2
  40. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/pyproject.toml +2 -2
  41. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/de.json +7 -1
  42. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/en.json +7 -1
  43. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/es.json +7 -1
  44. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/fr.json +7 -1
  45. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ja.json +7 -1
  46. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ko.json +7 -1
  47. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/pt-BR.json +7 -1
  48. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/ru.json +7 -1
  49. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-CN.json +7 -1
  50. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/locales/zh-TW.json +7 -1
  51. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/CHANGELOG.md +7 -0
  52. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/README.md +3 -3
  53. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package-lock.json +2 -2
  54. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.json +1 -1
  55. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package-lock.json +2 -2
  56. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.json +1 -1
  57. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/webview.ts +3 -1
  58. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +19 -0
  59. {crabcode-0.1.9 → crabcode-0.1.10}/pyproject.toml +1 -1
  60. crabcode-0.1.10/tests/test_api_parameter_forwarding.py +319 -0
  61. crabcode-0.1.10/tests/test_openai_reasoning.py +206 -0
  62. crabcode-0.1.9/packages/core/crabcode_core/api/network.py +0 -69
  63. crabcode-0.1.9/packages/desktop/src/App.startup.test.tsx +0 -83
  64. {crabcode-0.1.9 → crabcode-0.1.10}/.github/actions/client-apple-signing/action.yml +0 -0
  65. {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/client-packages.yml +0 -0
  66. {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/computer-use.yml +0 -0
  67. {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/document-engine-wheels.yml +0 -0
  68. {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/python-publish.yml +0 -0
  69. {crabcode-0.1.9 → crabcode-0.1.10}/.github/workflows/windows-compat.yml +0 -0
  70. {crabcode-0.1.9 → crabcode-0.1.10}/.gitignore +0 -0
  71. {crabcode-0.1.9 → crabcode-0.1.10}/README.md +0 -0
  72. {crabcode-0.1.9 → crabcode-0.1.10}/README.zh-CN.md +0 -0
  73. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/__init__.py +0 -0
  74. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/__main__.py +0 -0
  75. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/app.py +0 -0
  76. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/banner.py +0 -0
  77. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/computer_use.py +0 -0
  78. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_manager.py +0 -0
  79. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/model_picker.py +0 -0
  80. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/pipe.py +0 -0
  81. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/__init__.py +0 -0
  82. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/render/messages.py +0 -0
  83. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/repl.py +0 -0
  84. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/crabcode_cli/session_picker.py +0 -0
  85. {crabcode-0.1.9 → crabcode-0.1.10}/packages/cli/hatch_build.py +0 -0
  86. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/Cargo.toml +0 -0
  87. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/README.md +0 -0
  88. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/build.mjs +0 -0
  89. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/channel.d.ts +0 -0
  90. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/channel.js +0 -0
  91. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.cjs +0 -0
  92. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nativeClient.d.cts +0 -0
  93. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.d.ts +0 -0
  94. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/nodeChannel.js +0 -0
  95. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/package.json +0 -0
  96. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/src/channel.ts +0 -0
  97. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.d.ts +0 -0
  98. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/client/vscodeHost.js +0 -0
  99. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
  100. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
  101. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
  102. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
  103. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
  104. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
  105. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
  106. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
  107. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
  108. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
  109. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
  110. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
  111. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
  112. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
  113. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
  114. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
  115. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/computer_use.rs +0 -0
  116. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/src/lib.rs +0 -0
  117. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
  118. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
  119. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
  120. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
  121. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
  122. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
  123. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
  124. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/build.rs +0 -0
  125. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/lib.rs +0 -0
  126. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/main.rs +0 -0
  127. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/src/permission_guide.m +0 -0
  128. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/host/windows.rc +0 -0
  129. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/PROMPT.md +0 -0
  130. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.icns +0 -0
  131. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.ico +0 -0
  132. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/icons/icon.png +0 -0
  133. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/build-icons.mjs +0 -0
  134. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/build.mjs +0 -0
  135. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/check-wheel.py +0 -0
  136. {crabcode-0.1.9 → crabcode-0.1.10}/packages/computer-use/scripts/live-smoke.py +0 -0
  137. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/__init__.py +0 -0
  138. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/_windows_process.py +0 -0
  139. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/agent_manager.py +0 -0
  140. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/__init__.py +0 -0
  141. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/error_logging.py +0 -0
  142. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_discovery.py +0 -0
  143. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/model_info.py +0 -0
  144. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/api/registry.py +0 -0
  145. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/command_line.py +0 -0
  146. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/__init__.py +0 -0
  147. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/compact.py +0 -0
  148. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
  149. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_mode.py +0 -0
  150. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/computer_use_observation.py +0 -0
  151. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/__init__.py +0 -0
  152. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/claudemd.py +0 -0
  153. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/manager.py +0 -0
  154. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/config/model_catalog.py +0 -0
  155. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/events.py +0 -0
  156. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/file_lock.py +0 -0
  157. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/filesystem.py +0 -0
  158. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/goal.py +0 -0
  159. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/__init__.py +0 -0
  160. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/hooks/manager.py +0 -0
  161. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/image_io.py +0 -0
  162. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/io_worker.py +0 -0
  163. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/logging_utils.py +0 -0
  164. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/__init__.py +0 -0
  165. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/client.py +0 -0
  166. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
  167. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/lsp/manager.py +0 -0
  168. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/__init__.py +0 -0
  169. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/client.py +0 -0
  170. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/mcp/config.py +0 -0
  171. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/path_validation.py +0 -0
  172. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/paths.py +0 -0
  173. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/peer/__init__.py +0 -0
  174. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/peer/runtime.py +0 -0
  175. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/__init__.py +0 -0
  176. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
  177. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/permissions/manager.py +0 -0
  178. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/__init__.py +0 -0
  179. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/executor.py +0 -0
  180. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/plan/types.py +0 -0
  181. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/__init__.py +0 -0
  182. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/blocks.py +0 -0
  183. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/context.py +0 -0
  184. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/library.py +0 -0
  185. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/claude-code.json +0 -0
  186. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/codex.json +0 -0
  187. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/cursor.json +0 -0
  188. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/dsh.json +0 -0
  189. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/kimi-code.json +0 -0
  190. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/opencode.json +0 -0
  191. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/qoder.json +0 -0
  192. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets/zcode.json +0 -0
  193. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/presets.py +0 -0
  194. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/profile.py +0 -0
  195. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/system.py +0 -0
  196. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/prompts/templates.py +0 -0
  197. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/__init__.py +0 -0
  198. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
  199. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/loop.py +0 -0
  200. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/query/retry.py +0 -0
  201. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/__init__.py +0 -0
  202. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/manager.py +0 -0
  203. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/models.py +0 -0
  204. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/store.py +0 -0
  205. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/schedule/timing.py +0 -0
  206. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/__init__.py +0 -0
  207. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/export.py +0 -0
  208. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/meta_db.py +0 -0
  209. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/storage.py +0 -0
  210. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/session/title_gen.py +0 -0
  211. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/__init__.py +0 -0
  212. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/context.py +0 -0
  213. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/loader.py +0 -0
  214. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/skills/matcher.py +0 -0
  215. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
  216. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
  217. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
  218. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/subprocess_utils.py +0 -0
  219. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/__init__.py +0 -0
  220. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/bridge.py +0 -0
  221. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/inbox.py +0 -0
  222. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/manager.py +0 -0
  223. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/message_bus.py +0 -0
  224. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/models.py +0 -0
  225. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/team/recovery.py +0 -0
  226. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/text_io.py +0 -0
  227. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/__init__.py +0 -0
  228. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
  229. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
  230. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/agent.py +0 -0
  231. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
  232. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/ask_user.py +0 -0
  233. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/bash.py +0 -0
  234. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/browser.py +0 -0
  235. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checklist.py +0 -0
  236. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
  237. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/computer_use.py +0 -0
  238. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
  239. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_edit.py +0 -0
  240. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_read.py +0 -0
  241. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/file_write.py +0 -0
  242. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/glob.py +0 -0
  243. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/goal.py +0 -0
  244. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/grep.py +0 -0
  245. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image.py +0 -0
  246. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/image_generate.py +0 -0
  247. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/lint.py +0 -0
  248. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/loading.py +0 -0
  249. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/memory.py +0 -0
  250. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/monitor.py +0 -0
  251. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/peer.py +0 -0
  252. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/revert.py +0 -0
  253. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/schedule.py +0 -0
  254. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/skill.py +0 -0
  255. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
  256. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/team.py +0 -0
  257. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/tool_search.py +0 -0
  258. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/tools/web_search.py +0 -0
  259. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/turn_details.py +0 -0
  260. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/__init__.py +0 -0
  261. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/event.py +0 -0
  262. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/message.py +0 -0
  263. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/types/tool.py +0 -0
  264. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/usage.py +0 -0
  265. {crabcode-0.1.9 → crabcode-0.1.10}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
  266. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/__init__.py +0 -0
  267. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/adapters.py +0 -0
  268. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/dap.py +0 -0
  269. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/memory.py +0 -0
  270. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/process.py +0 -0
  271. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/runtime.py +0 -0
  272. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/sessions.py +0 -0
  273. {crabcode-0.1.9 → crabcode-0.1.10}/packages/debugger/crabcode_debugger/tool.py +0 -0
  274. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/README.md +0 -0
  275. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/THEMES.md +0 -0
  276. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/index.html +0 -0
  277. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/App.test.tsx +0 -0
  278. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ApprovalShortcutSettings.tsx +0 -0
  279. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.test.tsx +0 -0
  280. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReview.tsx +0 -0
  281. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
  282. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ChangeReviewControls.tsx +0 -0
  283. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
  284. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ComposerEditor.tsx +0 -0
  285. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
  286. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ConversationTurns.tsx +0 -0
  287. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/CopyButton.tsx +0 -0
  288. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentViewTabs.tsx +0 -0
  289. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
  290. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
  291. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
  292. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
  293. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
  294. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FileEditSummaryCard.tsx +0 -0
  295. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
  296. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/FollowUpQueue.tsx +0 -0
  297. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.test.tsx +0 -0
  298. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/GroupModelDiscovery.tsx +0 -0
  299. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.test.tsx +0 -0
  300. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ModelSettingsPanel.tsx +0 -0
  301. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
  302. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
  303. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ProjectFilesWorkspace.tsx +0 -0
  304. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.test.tsx +0 -0
  305. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/PromptSettingsPanel.tsx +0 -0
  306. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/ReviewMenu.tsx +0 -0
  307. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/RuntimeSettingsPanel.tsx +0 -0
  308. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
  309. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
  310. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/StatusBar.test.tsx +0 -0
  311. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/StatusBar.tsx +0 -0
  312. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.test.tsx +0 -0
  313. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TrajectoryView.tsx +0 -0
  314. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
  315. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/TurnDetailsButton.tsx +0 -0
  316. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.css +0 -0
  317. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
  318. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/UsageSettingsPanel.tsx +0 -0
  319. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
  320. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/VirtualMachineSettings.tsx +0 -0
  321. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
  322. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/approvalShortcuts.ts +0 -0
  323. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/computerUse.test.ts +0 -0
  324. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/computerUse.ts +0 -0
  325. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
  326. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/desktopSlashCommands.ts +0 -0
  327. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/diffRows.ts +0 -0
  328. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/events.test.ts +0 -0
  329. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/events.ts +0 -0
  330. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/favorites.test.ts +0 -0
  331. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/favorites.ts +0 -0
  332. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.test.ts +0 -0
  333. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/fileEditSummary.ts +0 -0
  334. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gateway.test.ts +0 -0
  335. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gateway.ts +0 -0
  336. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayErrors.test.ts +0 -0
  337. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.test.ts +0 -0
  338. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/gatewayStartup.ts +0 -0
  339. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/i18n.ts +0 -0
  340. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
  341. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/lumeInstaller.ts +0 -0
  342. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/markdownMath.ts +0 -0
  343. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.lume.test.ts +0 -0
  344. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.startup.test.ts +0 -0
  345. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.test.ts +0 -0
  346. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/native.ts +0 -0
  347. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/pathUtils.ts +0 -0
  348. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/permissionPresentation.ts +0 -0
  349. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
  350. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/promptTemplateFile.ts +0 -0
  351. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/reviewHistory.ts +0 -0
  352. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.test.ts +0 -0
  353. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/sessionNotifications.ts +0 -0
  354. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.test.ts +0 -0
  355. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/taskbarProgress.ts +0 -0
  356. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/theme.test.ts +0 -0
  357. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/theme.ts +0 -0
  358. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/themePackages.test.ts +0 -0
  359. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/themePackages.ts +0 -0
  360. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.test.ts +0 -0
  361. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/toolPresentation.ts +0 -0
  362. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/turnDetails.ts +0 -0
  363. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/types.ts +0 -0
  364. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useGitReview.test.tsx +0 -0
  365. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useGitReview.ts +0 -0
  366. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.test.tsx +0 -0
  367. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/useProjectModels.ts +0 -0
  368. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
  369. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/userPromptDisplay.ts +0 -0
  370. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/uuid.test.ts +0 -0
  371. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/uuid.ts +0 -0
  372. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/virtualMachine.ts +0 -0
  373. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src/vite-env.d.ts +0 -0
  374. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/build.rs +0 -0
  375. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128.png +0 -0
  376. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
  377. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/32x32.png +0 -0
  378. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.icns +0 -0
  379. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.ico +0 -0
  380. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/icons/icon.png +0 -0
  381. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
  382. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
  383. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway.rs +0 -0
  384. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
  385. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/main.rs +0 -0
  386. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/paths.rs +0 -0
  387. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/settings.rs +0 -0
  388. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
  389. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
  390. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
  391. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
  392. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/src/windows_python.rs +0 -0
  393. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
  394. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/tsconfig.json +0 -0
  395. {crabcode-0.1.9 → crabcode-0.1.10}/packages/desktop/vite.config.ts +0 -0
  396. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/__init__.py +0 -0
  397. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
  398. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
  399. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
  400. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
  401. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
  402. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/adapter.py +0 -0
  403. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/auth.py +0 -0
  404. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
  405. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
  406. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
  407. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
  408. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
  409. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
  410. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
  411. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
  412. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
  413. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/middleware.py +0 -0
  414. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/protocol.py +0 -0
  415. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
  416. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
  417. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
  418. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
  419. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/config.py +0 -0
  420. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
  421. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
  422. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
  423. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
  424. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
  425. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
  426. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
  427. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
  428. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
  429. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
  430. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
  431. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
  432. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
  433. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
  434. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/schemas.py +0 -0
  435. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/server.py +0 -0
  436. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
  437. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
  438. {crabcode-0.1.9 → crabcode-0.1.10}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
  439. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/__init__.py +0 -0
  440. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/background.py +0 -0
  441. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/chunker.py +0 -0
  442. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/embedder.py +0 -0
  443. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/indexer.py +0 -0
  444. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/store.py +0 -0
  445. {crabcode-0.1.9 → crabcode-0.1.10}/packages/search/crabcode_search/tool.py +0 -0
  446. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/README.md +0 -0
  447. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/index.d.ts +0 -0
  448. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/index.js +0 -0
  449. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/metadata.d.ts +0 -0
  450. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/metadata.js +0 -0
  451. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/runtime.js +0 -0
  452. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/i18n/runtime.test.mjs +0 -0
  453. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/package.json +0 -0
  454. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/slashCommands.d.ts +0 -0
  455. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/slashCommands.js +0 -0
  456. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/turnProcess.d.ts +0 -0
  457. {crabcode-0.1.9 → crabcode-0.1.10}/packages/shared/turnProcess.js +0 -0
  458. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.gitignore +0 -0
  459. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.nvmrc +0 -0
  460. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscode/launch.json +0 -0
  461. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscode/tasks.json +0 -0
  462. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/.vscodeignore +0 -0
  463. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/LICENSE +0 -0
  464. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/.vscodeignore +0 -0
  465. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/LICENSE +0 -0
  466. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/README.md +0 -0
  467. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/esbuild.cjs +0 -0
  468. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/extension.js +0 -0
  469. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/logo.png +0 -0
  470. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.de.json +0 -0
  471. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.es.json +0 -0
  472. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.fr.json +0 -0
  473. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ja.json +0 -0
  474. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.json +0 -0
  475. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ko.json +0 -0
  476. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.pt-br.json +0 -0
  477. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.ru.json +0 -0
  478. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-cn.json +0 -0
  479. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/computer-use/package.nls.zh-tw.json +0 -0
  480. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/esbuild.js +0 -0
  481. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/logo.png +0 -0
  482. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.de.json +0 -0
  483. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.es.json +0 -0
  484. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.fr.json +0 -0
  485. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ja.json +0 -0
  486. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.json +0 -0
  487. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ko.json +0 -0
  488. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.pt-br.json +0 -0
  489. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.ru.json +0 -0
  490. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.zh-cn.json +0 -0
  491. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/package.nls.zh-tw.json +0 -0
  492. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/resources/icon.svg +0 -0
  493. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/scripts/gen-types.py +0 -0
  494. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/chat/markdown.ts +0 -0
  495. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/chatPanel.ts +0 -0
  496. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/permissionPresentation.ts +0 -0
  497. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/protocol.ts +0 -0
  498. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/client/types.ts +0 -0
  499. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/computerUse.ts +0 -0
  500. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/connection.ts +0 -0
  501. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/crabCodeSettingsPanel.ts +0 -0
  502. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/extension.ts +0 -0
  503. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/gatewayManager.ts +0 -0
  504. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/i18n.ts +0 -0
  505. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/ideContext.ts +0 -0
  506. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/pendingEdits.ts +0 -0
  507. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/promptTemplateFile.ts +0 -0
  508. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/runtimeControls.ts +0 -0
  509. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/catalog.ts +0 -0
  510. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/protocol.ts +0 -0
  511. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/settings/webview.css +0 -0
  512. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/src/windowsPython.ts +0 -0
  513. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/chatMarkdown.test.cjs +0 -0
  514. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseController.test.cjs +0 -0
  515. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
  516. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUseNative.test.cjs +0 -0
  517. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
  518. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/contextUsage.test.cjs +0 -0
  519. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/followUp.test.cjs +0 -0
  520. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/gatewayManager.test.cjs +0 -0
  521. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
  522. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/i18n.cjs +0 -0
  523. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/settingsHarness.cjs +0 -0
  524. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
  525. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
  526. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/i18n.test.cjs +0 -0
  527. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/ideContext.test.cjs +0 -0
  528. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/imageCaptions.test.cjs +0 -0
  529. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/permissionPolicy.test.cjs +0 -0
  530. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
  531. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/sessionModel.test.cjs +0 -0
  532. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/sessionScope.test.cjs +0 -0
  533. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/slashCommands.test.cjs +0 -0
  534. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/streamRetry.test.cjs +0 -0
  535. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/turnDetails.test.cjs +0 -0
  536. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/turnProcess.test.cjs +0 -0
  537. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tests/windowsPython.test.cjs +0 -0
  538. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tsconfig.json +0 -0
  539. {crabcode-0.1.9 → crabcode-0.1.10}/packages/vscode/tsconfig.webview.json +0 -0
  540. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/audit_tool_cards.mjs +0 -0
  541. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/build_document_engine_bundle.py +0 -0
  542. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/i18n.mjs +0 -0
  543. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/package_clients.py +0 -0
  544. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/prompt_budget.py +0 -0
  545. {crabcode-0.1.9 → crabcode-0.1.10}/scripts/sync_version.py +0 -0
  546. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_api_error_logging.py +0 -0
  547. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_apply_patch.py +0 -0
  548. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_api_recovery.py +0 -0
  549. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_composer.py +0 -0
  550. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_computer_use.py +0 -0
  551. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_model_management.py +0 -0
  552. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_model_picker.py +0 -0
  553. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_session_picker.py +0 -0
  554. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_cli_yolo.py +0 -0
  555. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_client_packaging.py +0 -0
  556. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_codex_context_window.py +0 -0
  557. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_compact_prompt.py +0 -0
  558. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_compaction_settings.py +0 -0
  559. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use.py +0 -0
  560. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_ax.py +0 -0
  561. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_history.py +0 -0
  562. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_observation.py +0 -0
  563. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_packaging.py +0 -0
  564. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_policy.py +0 -0
  565. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_computer_use_window_observations.py +0 -0
  566. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_config_home.py +0 -0
  567. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_context_token_accounting.py +0 -0
  568. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_follow_up_messages.py +0 -0
  569. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_new_session_controls.py +0 -0
  570. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_runtime_info.py +0 -0
  571. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_gateway_send_message.py +0 -0
  572. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_git_review.py +0 -0
  573. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_image_context.py +0 -0
  574. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_image_tool.py +0 -0
  575. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_io_isolation.py +0 -0
  576. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_connection.py +0 -0
  577. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_discovery.py +0 -0
  578. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_info.py +0 -0
  579. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_model_settings_delete.py +0 -0
  580. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_network_policy.py +0 -0
  581. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_openai_tool_images.py +0 -0
  582. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_permission_policy_status.py +0 -0
  583. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_project_model_catalog.py +0 -0
  584. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_loading.py +0 -0
  585. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_presets.py +0 -0
  586. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_prompt_settings.py +0 -0
  587. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_read_images.py +0 -0
  588. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_reasoning_effort.py +0 -0
  589. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_resume_model.py +0 -0
  590. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_sdk_transport_compat.py +0 -0
  591. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_session_storage_performance.py +0 -0
  592. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_stream_reconnect.py +0 -0
  593. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_tool_loading.py +0 -0
  594. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_turn_details.py +0 -0
  595. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_usage.py +0 -0
  596. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_web_search.py +0 -0
  597. {crabcode-0.1.9 → crabcode-0.1.10}/tests/test_windows_audit_regressions.py +0 -0
  598. {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.9` or `v0.1.9`). Version mismatches fail before native builds.
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,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crabcode
3
- Version: 0.1.9
3
+ Version: 0.1.10
4
4
  Summary: CrabCode - AI coding assistant in the terminal
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: anthropic>=0.40.0
@@ -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.9"
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.9",
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.9"
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.9"
426
+ version = "0.1.10"
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.9"
3
+ version = "0.1.10"
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.9"
3
+ version = "0.1.10"
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.9"
3
+ VERSION = "0.1.10"
@@ -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 = httpx.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
- if config.reasoning_effort in {"low", "medium", "high", "xhigh", "max"}:
429
- params["output_config"] = {"effort": config.reasoning_effort}
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("max_tokens", None)
445
- payload.pop("temperature", None)
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
- async with self.client.messages.stream(**params) as stream:
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
- self.client = anthropic.AsyncAnthropicBedrock(**sdk_options(config, self._sdk))
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
- # Azure deployment name: env override takes precedence
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 = 300 # seconds
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 Responses-style APIs
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
- from crabcode_core.api.network import http_options, request_timeout
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
- if reasoning_effort != "none":
1071
- params["reasoning"] = {
1072
- "effort": reasoning_effort,
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, and disable thinking (not supported on the
16
- OpenAI-compatible surface).
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 disables extended thinking
16
- (local models do not support it).
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
- stream = await self.client.chat.completions.create(**params)
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 Responses API prompt cache routing key
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.9"
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.9"
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.9",
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.9",
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",
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",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "crabcode-desktop",
3
3
  "private": true,
4
- "version": "0.1.9",
4
+ "version": "0.1.10",
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",