crabcode 0.1.8__tar.gz → 0.1.10__tar.gz

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