crabcode 0.1.6__tar.gz → 0.1.7__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 (579) hide show
  1. crabcode-0.1.7/.github/actions/client-apple-signing/action.yml +51 -0
  2. crabcode-0.1.7/.github/workflows/client-packages.yml +214 -0
  3. {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/windows-compat.yml +5 -0
  4. {crabcode-0.1.6 → crabcode-0.1.7}/PKG-INFO +1 -1
  5. {crabcode-0.1.6 → crabcode-0.1.7}/README.md +5 -0
  6. {crabcode-0.1.6 → crabcode-0.1.7}/README.zh-CN.md +7 -0
  7. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/computer_use.py +10 -0
  8. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/repl.py +24 -1
  9. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/pyproject.toml +2 -2
  10. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/Cargo.lock +2 -2
  11. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/README.md +14 -5
  12. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nativeClient.cjs +13 -1
  13. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/vscodeHost.d.ts +1 -1
  14. crabcode-0.1.7/packages/computer-use/client/vscodeHost.js +131 -0
  15. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/Cargo.toml +1 -1
  16. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/Cargo.toml +1 -1
  17. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/_version.py +1 -1
  18. crabcode-0.1.7/packages/core/crabcode_core/api/model_discovery.py +136 -0
  19. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/model_info.py +11 -5
  20. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/pyproject.toml +1 -1
  21. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/pyproject.toml +2 -2
  22. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/README.md +9 -0
  23. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/package-lock.json +2 -2
  24. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/package.json +5 -3
  25. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.startup.test.tsx +4 -0
  26. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.test.tsx +14 -1
  27. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.tsx +608 -596
  28. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ApprovalShortcutSettings.tsx +16 -15
  29. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReview.tsx +16 -17
  30. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReviewControls.tsx +24 -23
  31. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ComposerEditor.tsx +16 -14
  32. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ConversationTurns.tsx +8 -7
  33. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/CopyButton.tsx +5 -4
  34. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentViewTabs.tsx +6 -6
  35. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.files.test.tsx +1 -1
  36. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.tsx +103 -103
  37. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FileEditSummaryCard.tsx +6 -9
  38. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FollowUpQueue.tsx +13 -12
  39. crabcode-0.1.7/packages/desktop/src/GroupModelDiscovery.test.tsx +66 -0
  40. crabcode-0.1.7/packages/desktop/src/GroupModelDiscovery.tsx +113 -0
  41. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ModelSettingsPanel.test.tsx +2 -1
  42. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ModelSettingsPanel.tsx +117 -77
  43. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ProjectFilesWorkspace.tsx +52 -50
  44. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PromptSettingsPanel.test.tsx +6 -4
  45. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PromptSettingsPanel.tsx +68 -65
  46. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ReviewMenu.tsx +5 -3
  47. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/RuntimeSettingsPanel.tsx +60 -61
  48. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SettingsView.test.tsx +32 -0
  49. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SettingsView.tsx +264 -243
  50. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/StatusBar.tsx +80 -78
  51. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TrajectoryView.test.tsx +2 -2
  52. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TrajectoryView.tsx +41 -39
  53. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TurnDetailsButton.tsx +6 -5
  54. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.tsx +76 -81
  55. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/VirtualMachineSettings.tsx +65 -65
  56. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/approvalShortcuts.ts +2 -1
  57. crabcode-0.1.7/packages/desktop/src/desktopSlashCommands.ts +116 -0
  58. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/events.ts +17 -16
  59. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/favorites.ts +2 -1
  60. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gateway.ts +14 -4
  61. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayStartup.ts +9 -8
  62. crabcode-0.1.7/packages/desktop/src/i18n.ts +11 -0
  63. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/lumeInstaller.ts +3 -2
  64. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/main.tsx +3 -0
  65. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.test.ts +9 -0
  66. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.ts +18 -15
  67. crabcode-0.1.7/packages/desktop/src/permissionPresentation.ts +65 -0
  68. {crabcode-0.1.6/packages/vscode → crabcode-0.1.7/packages/desktop}/src/promptTemplateFile.ts +16 -16
  69. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/sessionNotifications.ts +7 -6
  70. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/styles.css +109 -2
  71. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/theme.ts +30 -29
  72. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/themePackages.ts +43 -42
  73. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/toolPresentation.ts +12 -11
  74. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/turnDetails.ts +17 -15
  75. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/types.ts +8 -0
  76. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useGitReview.ts +4 -3
  77. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/userPromptDisplay.ts +8 -7
  78. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/Cargo.lock +3 -3
  79. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/Cargo.toml +1 -1
  80. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/settings.rs +1 -0
  81. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/tauri.conf.json +1 -1
  82. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/config.py +54 -1
  83. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/schemas.py +8 -0
  84. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/pyproject.toml +2 -2
  85. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/pyproject.toml +2 -2
  86. crabcode-0.1.7/packages/shared/i18n/README.md +50 -0
  87. crabcode-0.1.7/packages/shared/i18n/index.d.ts +28 -0
  88. crabcode-0.1.7/packages/shared/i18n/index.js +22 -0
  89. crabcode-0.1.7/packages/shared/i18n/locales/de.json +2866 -0
  90. crabcode-0.1.7/packages/shared/i18n/locales/en.json +2866 -0
  91. crabcode-0.1.7/packages/shared/i18n/locales/es.json +2866 -0
  92. crabcode-0.1.7/packages/shared/i18n/locales/fr.json +2866 -0
  93. crabcode-0.1.7/packages/shared/i18n/locales/ja.json +2866 -0
  94. crabcode-0.1.7/packages/shared/i18n/locales/ko.json +2866 -0
  95. crabcode-0.1.7/packages/shared/i18n/locales/pt-BR.json +2866 -0
  96. crabcode-0.1.7/packages/shared/i18n/locales/ru.json +2866 -0
  97. crabcode-0.1.7/packages/shared/i18n/locales/zh-CN.json +2866 -0
  98. crabcode-0.1.7/packages/shared/i18n/locales/zh-TW.json +2866 -0
  99. crabcode-0.1.7/packages/shared/i18n/metadata.d.ts +2 -0
  100. crabcode-0.1.7/packages/shared/i18n/metadata.js +6 -0
  101. crabcode-0.1.7/packages/shared/i18n/runtime.js +64 -0
  102. crabcode-0.1.7/packages/shared/i18n/runtime.test.mjs +67 -0
  103. crabcode-0.1.7/packages/shared/package.json +7 -0
  104. {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/slashCommands.d.ts +1 -0
  105. {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/slashCommands.js +133 -131
  106. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscode/launch.json +2 -1
  107. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscodeignore +1 -0
  108. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/README.md +34 -7
  109. crabcode-0.1.7/packages/vscode/computer-use/README.md +22 -0
  110. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/package-lock.json +2 -2
  111. crabcode-0.1.7/packages/vscode/computer-use/package.json +36 -0
  112. crabcode-0.1.7/packages/vscode/computer-use/package.nls.de.json +3 -0
  113. crabcode-0.1.7/packages/vscode/computer-use/package.nls.es.json +3 -0
  114. crabcode-0.1.7/packages/vscode/computer-use/package.nls.fr.json +3 -0
  115. crabcode-0.1.7/packages/vscode/computer-use/package.nls.ja.json +3 -0
  116. crabcode-0.1.7/packages/vscode/computer-use/package.nls.json +3 -0
  117. crabcode-0.1.7/packages/vscode/computer-use/package.nls.ko.json +3 -0
  118. crabcode-0.1.7/packages/vscode/computer-use/package.nls.pt-br.json +3 -0
  119. crabcode-0.1.7/packages/vscode/computer-use/package.nls.ru.json +3 -0
  120. crabcode-0.1.7/packages/vscode/computer-use/package.nls.zh-cn.json +3 -0
  121. crabcode-0.1.7/packages/vscode/computer-use/package.nls.zh-tw.json +3 -0
  122. crabcode-0.1.7/packages/vscode/logo.png +0 -0
  123. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/package-lock.json +2 -2
  124. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/package.json +97 -60
  125. crabcode-0.1.7/packages/vscode/package.nls.de.json +68 -0
  126. crabcode-0.1.7/packages/vscode/package.nls.es.json +68 -0
  127. crabcode-0.1.7/packages/vscode/package.nls.fr.json +68 -0
  128. crabcode-0.1.7/packages/vscode/package.nls.ja.json +68 -0
  129. crabcode-0.1.7/packages/vscode/package.nls.json +68 -0
  130. crabcode-0.1.7/packages/vscode/package.nls.ko.json +68 -0
  131. crabcode-0.1.7/packages/vscode/package.nls.pt-br.json +68 -0
  132. crabcode-0.1.7/packages/vscode/package.nls.ru.json +68 -0
  133. crabcode-0.1.7/packages/vscode/package.nls.zh-cn.json +68 -0
  134. crabcode-0.1.7/packages/vscode/package.nls.zh-tw.json +68 -0
  135. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/scripts/gen-types.py +20 -2
  136. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/chatPanel.ts +560 -528
  137. crabcode-0.1.7/packages/vscode/src/client/permissionPresentation.ts +52 -0
  138. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/client/types.ts +21 -3
  139. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/computerUse.ts +12 -22
  140. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/crabCodeSettingsPanel.ts +33 -22
  141. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/extension.ts +32 -25
  142. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/gatewayManager.ts +109 -77
  143. crabcode-0.1.7/packages/vscode/src/i18n.ts +10 -0
  144. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/ideContext.ts +8 -7
  145. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/pendingEdits.ts +19 -18
  146. {crabcode-0.1.6/packages/desktop → crabcode-0.1.7/packages/vscode}/src/promptTemplateFile.ts +16 -16
  147. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/runtimeControls.ts +4 -3
  148. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/catalog.ts +19 -10
  149. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/protocol.ts +3 -0
  150. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/webview.css +115 -0
  151. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/webview.ts +465 -199
  152. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseController.test.cjs +19 -7
  153. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseNative.test.cjs +28 -3
  154. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/contextUsage.test.cjs +1 -1
  155. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +58 -0
  156. crabcode-0.1.7/packages/vscode/tests/gatewayManager.test.cjs +265 -0
  157. crabcode-0.1.7/packages/vscode/tests/helpers/i18n.cjs +12 -0
  158. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/settingsHarness.cjs +4 -1
  159. crabcode-0.1.7/packages/vscode/tests/i18n.test.cjs +111 -0
  160. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/imageCaptions.test.cjs +2 -2
  161. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/permissionPolicy.test.cjs +11 -0
  162. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/streamRetry.test.cjs +1 -0
  163. {crabcode-0.1.6 → crabcode-0.1.7}/pyproject.toml +1 -1
  164. {crabcode-0.1.6 → crabcode-0.1.7}/scripts/audit_tool_cards.mjs +4 -3
  165. crabcode-0.1.7/scripts/i18n.mjs +107 -0
  166. crabcode-0.1.7/scripts/package_clients.py +339 -0
  167. {crabcode-0.1.6 → crabcode-0.1.7}/scripts/sync_version.py +17 -11
  168. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_composer.py +39 -0
  169. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_computer_use.py +95 -0
  170. crabcode-0.1.7/tests/test_client_packaging.py +254 -0
  171. crabcode-0.1.7/tests/test_model_discovery.py +200 -0
  172. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_info.py +2 -2
  173. crabcode-0.1.6/packages/computer-use/client/vscodeHost.js +0 -138
  174. crabcode-0.1.6/packages/desktop/src/desktopSlashCommands.ts +0 -115
  175. crabcode-0.1.6/packages/desktop/src/permissionPresentation.ts +0 -64
  176. crabcode-0.1.6/packages/shared/package.json +0 -4
  177. crabcode-0.1.6/packages/vscode/computer-use/README.md +0 -19
  178. crabcode-0.1.6/packages/vscode/computer-use/package.json +0 -20
  179. crabcode-0.1.6/packages/vscode/logo.png +0 -0
  180. crabcode-0.1.6/packages/vscode/src/client/permissionPresentation.ts +0 -64
  181. crabcode-0.1.6/packages/vscode/tests/gatewayManager.test.cjs +0 -114
  182. {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/computer-use.yml +0 -0
  183. {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/document-engine-wheels.yml +0 -0
  184. {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/python-publish.yml +0 -0
  185. {crabcode-0.1.6 → crabcode-0.1.7}/.gitignore +0 -0
  186. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/__init__.py +0 -0
  187. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/__main__.py +0 -0
  188. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/app.py +0 -0
  189. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/banner.py +0 -0
  190. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/model_manager.py +0 -0
  191. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/model_picker.py +0 -0
  192. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/pipe.py +0 -0
  193. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/render/__init__.py +0 -0
  194. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/render/messages.py +0 -0
  195. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/session_picker.py +0 -0
  196. {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/hatch_build.py +0 -0
  197. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/Cargo.toml +0 -0
  198. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/build.mjs +0 -0
  199. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/channel.d.ts +0 -0
  200. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/channel.js +0 -0
  201. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nativeClient.d.cts +0 -0
  202. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nodeChannel.d.ts +0 -0
  203. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nodeChannel.js +0 -0
  204. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/package.json +0 -0
  205. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/src/channel.ts +0 -0
  206. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
  207. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
  208. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
  209. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
  210. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
  211. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
  212. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
  213. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
  214. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
  215. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
  216. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
  217. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
  218. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
  219. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
  220. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
  221. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
  222. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use.rs +0 -0
  223. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/lib.rs +0 -0
  224. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
  225. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
  226. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
  227. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
  228. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
  229. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
  230. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
  231. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/build.rs +0 -0
  232. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/lib.rs +0 -0
  233. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/main.rs +0 -0
  234. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/permission_guide.m +0 -0
  235. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/windows.rc +0 -0
  236. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/PROMPT.md +0 -0
  237. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.icns +0 -0
  238. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.ico +0 -0
  239. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.png +0 -0
  240. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/build-icons.mjs +0 -0
  241. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/build.mjs +0 -0
  242. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/check-wheel.py +0 -0
  243. {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/live-smoke.py +0 -0
  244. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/__init__.py +0 -0
  245. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/_windows_process.py +0 -0
  246. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/agent_manager.py +0 -0
  247. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/__init__.py +0 -0
  248. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/anthropic_adapter.py +0 -0
  249. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/azure_adapter.py +0 -0
  250. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/base.py +0 -0
  251. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/codex_adapter.py +0 -0
  252. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/error_logging.py +0 -0
  253. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/gemini_adapter.py +0 -0
  254. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/network.py +0 -0
  255. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/ollama_adapter.py +0 -0
  256. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/openai_adapter.py +0 -0
  257. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/registry.py +0 -0
  258. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/command_line.py +0 -0
  259. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/__init__.py +0 -0
  260. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/compact.py +0 -0
  261. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
  262. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/computer_use_mode.py +0 -0
  263. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/computer_use_observation.py +0 -0
  264. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/__init__.py +0 -0
  265. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/claudemd.py +0 -0
  266. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/manager.py +0 -0
  267. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/model_catalog.py +0 -0
  268. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/events.py +0 -0
  269. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/file_lock.py +0 -0
  270. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/filesystem.py +0 -0
  271. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/goal.py +0 -0
  272. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/hooks/__init__.py +0 -0
  273. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/hooks/manager.py +0 -0
  274. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/image_io.py +0 -0
  275. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/io_worker.py +0 -0
  276. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/logging_utils.py +0 -0
  277. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/__init__.py +0 -0
  278. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/client.py +0 -0
  279. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
  280. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/manager.py +0 -0
  281. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/__init__.py +0 -0
  282. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/client.py +0 -0
  283. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/config.py +0 -0
  284. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/path_validation.py +0 -0
  285. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/paths.py +0 -0
  286. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/peer/__init__.py +0 -0
  287. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/peer/runtime.py +0 -0
  288. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/__init__.py +0 -0
  289. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
  290. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/manager.py +0 -0
  291. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/__init__.py +0 -0
  292. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/executor.py +0 -0
  293. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/types.py +0 -0
  294. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/__init__.py +0 -0
  295. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/blocks.py +0 -0
  296. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/context.py +0 -0
  297. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/library.py +0 -0
  298. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/profile.py +0 -0
  299. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/system.py +0 -0
  300. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/templates.py +0 -0
  301. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/__init__.py +0 -0
  302. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
  303. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/loop.py +0 -0
  304. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/retry.py +0 -0
  305. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/__init__.py +0 -0
  306. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/manager.py +0 -0
  307. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/models.py +0 -0
  308. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/store.py +0 -0
  309. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/timing.py +0 -0
  310. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/__init__.py +0 -0
  311. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/export.py +0 -0
  312. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/meta_db.py +0 -0
  313. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/storage.py +0 -0
  314. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/title_gen.py +0 -0
  315. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/__init__.py +0 -0
  316. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/context.py +0 -0
  317. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/loader.py +0 -0
  318. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/matcher.py +0 -0
  319. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
  320. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
  321. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
  322. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/subprocess_utils.py +0 -0
  323. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/__init__.py +0 -0
  324. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/bridge.py +0 -0
  325. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/inbox.py +0 -0
  326. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/manager.py +0 -0
  327. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/message_bus.py +0 -0
  328. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/models.py +0 -0
  329. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/recovery.py +0 -0
  330. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/text_io.py +0 -0
  331. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/__init__.py +0 -0
  332. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
  333. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
  334. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/agent.py +0 -0
  335. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
  336. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/ask_user.py +0 -0
  337. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/bash.py +0 -0
  338. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/browser.py +0 -0
  339. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/checklist.py +0 -0
  340. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
  341. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/computer_use.py +0 -0
  342. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
  343. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_edit.py +0 -0
  344. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_read.py +0 -0
  345. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_write.py +0 -0
  346. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/glob.py +0 -0
  347. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/goal.py +0 -0
  348. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/grep.py +0 -0
  349. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/image.py +0 -0
  350. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/image_generate.py +0 -0
  351. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/lint.py +0 -0
  352. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/loading.py +0 -0
  353. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/memory.py +0 -0
  354. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/monitor.py +0 -0
  355. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/peer.py +0 -0
  356. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/revert.py +0 -0
  357. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/schedule.py +0 -0
  358. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/skill.py +0 -0
  359. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
  360. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/team.py +0 -0
  361. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/tool_search.py +0 -0
  362. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/web_search.py +0 -0
  363. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/turn_details.py +0 -0
  364. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/__init__.py +0 -0
  365. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/config.py +0 -0
  366. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/event.py +0 -0
  367. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/message.py +0 -0
  368. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/tool.py +0 -0
  369. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/usage.py +0 -0
  370. {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
  371. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/__init__.py +0 -0
  372. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/adapters.py +0 -0
  373. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/dap.py +0 -0
  374. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/memory.py +0 -0
  375. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/process.py +0 -0
  376. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/runtime.py +0 -0
  377. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/sessions.py +0 -0
  378. {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/tool.py +0 -0
  379. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/THEMES.md +0 -0
  380. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/index.html +0 -0
  381. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReview.test.tsx +0 -0
  382. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
  383. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
  384. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
  385. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
  386. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
  387. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
  388. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
  389. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
  390. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
  391. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
  392. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
  393. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
  394. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
  395. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/StatusBar.test.tsx +0 -0
  396. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
  397. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.css +0 -0
  398. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
  399. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
  400. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
  401. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/computerUse.test.ts +0 -0
  402. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/computerUse.ts +0 -0
  403. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
  404. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/diffRows.ts +0 -0
  405. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/events.test.ts +0 -0
  406. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/favorites.test.ts +0 -0
  407. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/fileEditSummary.test.ts +0 -0
  408. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/fileEditSummary.ts +0 -0
  409. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gateway.test.ts +0 -0
  410. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayErrors.test.ts +0 -0
  411. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayStartup.test.ts +0 -0
  412. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
  413. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/markdownMath.ts +0 -0
  414. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.lume.test.ts +0 -0
  415. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.startup.test.ts +0 -0
  416. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/pathUtils.ts +0 -0
  417. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/platform.ts +0 -0
  418. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
  419. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/reviewHistory.ts +0 -0
  420. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/sessionNotifications.test.ts +0 -0
  421. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/taskbarProgress.test.ts +0 -0
  422. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/taskbarProgress.ts +0 -0
  423. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/theme.test.ts +0 -0
  424. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/themePackages.test.ts +0 -0
  425. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/toolPresentation.test.ts +0 -0
  426. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useGitReview.test.tsx +0 -0
  427. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useProjectModels.test.tsx +0 -0
  428. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useProjectModels.ts +0 -0
  429. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
  430. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/uuid.test.ts +0 -0
  431. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/uuid.ts +0 -0
  432. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/virtualMachine.ts +0 -0
  433. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/vite-env.d.ts +0 -0
  434. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/build.rs +0 -0
  435. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/capabilities/default.json +0 -0
  436. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/128x128.png +0 -0
  437. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
  438. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/32x32.png +0 -0
  439. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.icns +0 -0
  440. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.ico +0 -0
  441. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.png +0 -0
  442. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
  443. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
  444. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/gateway.rs +0 -0
  445. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
  446. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/lib.rs +0 -0
  447. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/main.rs +0 -0
  448. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/paths.rs +0 -0
  449. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
  450. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
  451. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
  452. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
  453. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
  454. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/tsconfig.json +0 -0
  455. {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/vite.config.ts +0 -0
  456. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/__init__.py +0 -0
  457. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
  458. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
  459. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
  460. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
  461. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
  462. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/adapter.py +0 -0
  463. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/auth.py +0 -0
  464. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
  465. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
  466. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
  467. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
  468. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
  469. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
  470. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
  471. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
  472. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
  473. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/middleware.py +0 -0
  474. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/protocol.py +0 -0
  475. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
  476. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
  477. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
  478. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
  479. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
  480. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
  481. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
  482. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
  483. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
  484. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
  485. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
  486. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
  487. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
  488. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
  489. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
  490. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
  491. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
  492. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
  493. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/server.py +0 -0
  494. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
  495. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
  496. {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
  497. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/__init__.py +0 -0
  498. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/background.py +0 -0
  499. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/chunker.py +0 -0
  500. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/embedder.py +0 -0
  501. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/indexer.py +0 -0
  502. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/store.py +0 -0
  503. {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/tool.py +0 -0
  504. {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/turnProcess.d.ts +0 -0
  505. {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/turnProcess.js +0 -0
  506. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.gitignore +0 -0
  507. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.nvmrc +0 -0
  508. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscode/tasks.json +0 -0
  509. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/CHANGELOG.md +0 -0
  510. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/LICENSE +0 -0
  511. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/.vscodeignore +0 -0
  512. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/LICENSE +0 -0
  513. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/esbuild.cjs +0 -0
  514. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/extension.js +0 -0
  515. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/esbuild.js +0 -0
  516. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/resources/icon.svg +0 -0
  517. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/client/protocol.ts +0 -0
  518. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/connection.ts +0 -0
  519. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
  520. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
  521. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/followUp.test.cjs +0 -0
  522. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
  523. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
  524. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
  525. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/ideContext.test.cjs +0 -0
  526. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
  527. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/slashCommands.test.cjs +0 -0
  528. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/turnDetails.test.cjs +0 -0
  529. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/turnProcess.test.cjs +0 -0
  530. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tsconfig.json +0 -0
  531. {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tsconfig.webview.json +0 -0
  532. {crabcode-0.1.6 → crabcode-0.1.7}/scripts/build_document_engine_bundle.py +0 -0
  533. {crabcode-0.1.6 → crabcode-0.1.7}/scripts/prompt_budget.py +0 -0
  534. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_api_error_logging.py +0 -0
  535. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_apply_patch.py +0 -0
  536. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_api_recovery.py +0 -0
  537. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_model_management.py +0 -0
  538. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_model_picker.py +0 -0
  539. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_session_picker.py +0 -0
  540. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_yolo.py +0 -0
  541. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_codex_context_window.py +0 -0
  542. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_compact_prompt.py +0 -0
  543. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_compaction_settings.py +0 -0
  544. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use.py +0 -0
  545. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_ax.py +0 -0
  546. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_history.py +0 -0
  547. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_observation.py +0 -0
  548. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_packaging.py +0 -0
  549. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_policy.py +0 -0
  550. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_window_observations.py +0 -0
  551. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_config_home.py +0 -0
  552. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_context_token_accounting.py +0 -0
  553. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_follow_up_messages.py +0 -0
  554. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_new_session_controls.py +0 -0
  555. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_runtime_info.py +0 -0
  556. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_send_message.py +0 -0
  557. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_git_review.py +0 -0
  558. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_image_context.py +0 -0
  559. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_image_tool.py +0 -0
  560. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_io_isolation.py +0 -0
  561. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_connection.py +0 -0
  562. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_settings_delete.py +0 -0
  563. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_network_policy.py +0 -0
  564. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_openai_tool_images.py +0 -0
  565. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_permission_policy_status.py +0 -0
  566. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_project_model_catalog.py +0 -0
  567. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_prompt_loading.py +0 -0
  568. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_prompt_settings.py +0 -0
  569. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_read_images.py +0 -0
  570. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_reasoning_effort.py +0 -0
  571. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_resume_model.py +0 -0
  572. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_session_storage_performance.py +0 -0
  573. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_stream_reconnect.py +0 -0
  574. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_tool_loading.py +0 -0
  575. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_turn_details.py +0 -0
  576. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_usage.py +0 -0
  577. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_web_search.py +0 -0
  578. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_windows_audit_regressions.py +0 -0
  579. {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_windows_compat.py +0 -0
@@ -0,0 +1,51 @@
1
+ name: Client Apple signing
2
+ description: Import the optional shared Computer Use and Desktop signing identity
3
+ inputs:
4
+ certificate:
5
+ description: Base64 encoded signing certificate in PKCS12 format
6
+ required: false
7
+ password:
8
+ description: PKCS12 password
9
+ required: false
10
+ identity:
11
+ description: Developer ID signing identity
12
+ required: false
13
+ outputs:
14
+ identity:
15
+ description: Imported identity, or ad-hoc signing when no credentials are configured
16
+ value: ${{ steps.import.outputs.identity }}
17
+ runs:
18
+ using: composite
19
+ steps:
20
+ - id: import
21
+ shell: bash
22
+ env:
23
+ CLIENT_SIGNING_CERTIFICATE: ${{ inputs.certificate }}
24
+ CLIENT_SIGNING_PASSWORD: ${{ inputs.password }}
25
+ CLIENT_SIGNING_IDENTITY: ${{ inputs.identity }}
26
+ run: |
27
+ if [ -z "$CLIENT_SIGNING_CERTIFICATE" ] && [ -z "$CLIENT_SIGNING_IDENTITY" ]; then
28
+ echo 'identity=-' >> "$GITHUB_OUTPUT"
29
+ exit 0
30
+ fi
31
+ if [ -z "$CLIENT_SIGNING_CERTIFICATE" ] || [ -z "$CLIENT_SIGNING_IDENTITY" ]; then
32
+ echo 'Configure both CRABCODE_SIGNING_CERTIFICATE_P12_BASE64 and CRABCODE_SIGNING_IDENTITY.' >&2
33
+ exit 1
34
+ fi
35
+ certificate="$RUNNER_TEMP/client-signing.p12"
36
+ trap 'rm -f "$certificate"' EXIT
37
+ python - <<'PY'
38
+ import base64, os
39
+ from pathlib import Path
40
+ (Path(os.environ['RUNNER_TEMP']) / 'client-signing.p12').write_bytes(
41
+ base64.b64decode(''.join(os.environ['CLIENT_SIGNING_CERTIFICATE'].split()), validate=True))
42
+ PY
43
+ keychain="$RUNNER_TEMP/client-signing.keychain-db"
44
+ keychain_password="$(openssl rand -base64 32)"
45
+ security create-keychain -p "$keychain_password" "$keychain"
46
+ security set-keychain-settings -lut 21600 "$keychain"
47
+ security unlock-keychain -p "$keychain_password" "$keychain"
48
+ security import "$certificate" -k "$keychain" -P "$CLIENT_SIGNING_PASSWORD" -T /usr/bin/codesign
49
+ security set-key-partition-list -S apple-tool:,apple: -k "$keychain_password" "$keychain" >/dev/null
50
+ security list-keychains -d user -s "$keychain" login.keychain-db
51
+ printf 'identity=%s\n' "$CLIENT_SIGNING_IDENTITY" >> "$GITHUB_OUTPUT"
@@ -0,0 +1,214 @@
1
+ name: Client Packages
2
+ run-name: Client packages · ${{ github.ref_name }} · ${{ github.run_number }}
3
+
4
+ # Download the packages from this run's Artifacts and upload them manually.
5
+ # Python Release/PyPI publishing is intentionally independent.
6
+ on:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ checks:
14
+ name: Check client versions and tests
15
+ timeout-minutes: 20
16
+ runs-on: ubuntu-24.04
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: '22'
22
+ cache: npm
23
+ cache-dependency-path: |
24
+ packages/vscode/package-lock.json
25
+ packages/vscode/computer-use/package-lock.json
26
+ packages/desktop/package-lock.json
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: '3.12'
30
+ - name: Check version metadata and Marketplace assets
31
+ run: |
32
+ python scripts/sync_version.py --check
33
+ python scripts/package_clients.py check
34
+ python packages/vscode/scripts/gen-types.py --check
35
+ - run: npm ci
36
+ working-directory: packages/vscode
37
+ - run: npm run lint
38
+ working-directory: packages/vscode
39
+ - run: npm test
40
+ working-directory: packages/vscode
41
+ - run: python -m unittest discover -s tests -p test_client_packaging.py -v
42
+ - run: npm ci
43
+ working-directory: packages/desktop
44
+ - run: npm test
45
+ working-directory: packages/desktop
46
+
47
+ native:
48
+ name: Computer Use · ${{ matrix.platform }}
49
+ timeout-minutes: 45
50
+ needs: checks
51
+ strategy:
52
+ fail-fast: false
53
+ matrix:
54
+ include:
55
+ - platform: darwin-arm64
56
+ os: macos-15
57
+ - platform: darwin-x64
58
+ os: macos-15-intel
59
+ - platform: win32-x64
60
+ os: windows-2022
61
+ runs-on: ${{ matrix.os }}
62
+ env:
63
+ MACOSX_DEPLOYMENT_TARGET: '11.0'
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+ - uses: actions/setup-node@v4
67
+ with:
68
+ node-version: '22'
69
+ - uses: actions/setup-python@v5
70
+ with:
71
+ python-version: '3.12'
72
+ - uses: dtolnay/rust-toolchain@stable
73
+ - uses: Swatinem/rust-cache@v2
74
+ with:
75
+ workspaces: packages/computer-use -> target
76
+ shared-key: client-native-${{ matrix.platform }}
77
+ - id: signing
78
+ if: runner.os == 'macOS'
79
+ uses: ./.github/actions/client-apple-signing
80
+ with:
81
+ certificate: ${{ secrets.CRABCODE_SIGNING_CERTIFICATE_P12_BASE64 }}
82
+ password: ${{ secrets.CRABCODE_SIGNING_CERTIFICATE_PASSWORD }}
83
+ identity: ${{ secrets.CRABCODE_SIGNING_IDENTITY }}
84
+ - run: cargo test --locked --workspace
85
+ working-directory: packages/computer-use
86
+ - name: Build native bundle once
87
+ env:
88
+ CRABCODE_SIGNING_IDENTITY: ${{ steps.signing.outputs.identity }}
89
+ run: node packages/computer-use/scripts/build.mjs
90
+ - name: Verify bundle and target architecture
91
+ run: python scripts/package_clients.py native --platform ${{ matrix.platform }}
92
+ - name: Archive bundle with executable permissions and signatures
93
+ shell: bash
94
+ run: tar -czf computer-use-${{ matrix.platform }}.tar.gz -C packages/computer-use/dist ${{ matrix.platform }}
95
+ - uses: actions/upload-artifact@v4
96
+ with:
97
+ name: computer-use-${{ matrix.platform }}
98
+ path: computer-use-${{ matrix.platform }}.tar.gz
99
+ if-no-files-found: error
100
+ retention-days: 7
101
+ overwrite: true
102
+
103
+ vsix:
104
+ name: Platform and universal VSIXs
105
+ timeout-minutes: 20
106
+ needs: native
107
+ runs-on: ubuntu-24.04
108
+ steps:
109
+ - uses: actions/checkout@v4
110
+ - uses: actions/setup-node@v4
111
+ with:
112
+ node-version: '22'
113
+ cache: npm
114
+ cache-dependency-path: |
115
+ packages/vscode/package-lock.json
116
+ packages/vscode/computer-use/package-lock.json
117
+ - uses: actions/setup-python@v5
118
+ with:
119
+ python-version: '3.12'
120
+ - uses: actions/download-artifact@v4
121
+ with:
122
+ pattern: computer-use-*
123
+ merge-multiple: true
124
+ path: native-bundles
125
+ - name: Restore all native bundles
126
+ run: |
127
+ mkdir -p packages/computer-use/dist
128
+ for archive in native-bundles/*.tar.gz; do
129
+ tar -xzf "$archive" -C packages/computer-use/dist
130
+ done
131
+ - run: npm ci
132
+ working-directory: packages/vscode
133
+ - run: npm ci
134
+ working-directory: packages/vscode/computer-use
135
+ - name: Package and inspect all VSIXs
136
+ run: python scripts/package_clients.py vsix --output dist/vsix
137
+ - uses: actions/upload-artifact@v4
138
+ with:
139
+ name: vsix-${{ github.run_number }}
140
+ path: dist/vsix/
141
+ if-no-files-found: error
142
+ retention-days: 30
143
+ overwrite: true
144
+ - name: Add download instructions
145
+ run: |
146
+ 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"
148
+
149
+ desktop:
150
+ name: Desktop installer · ${{ matrix.platform }}
151
+ timeout-minutes: 90
152
+ needs: native
153
+ strategy:
154
+ fail-fast: false
155
+ matrix:
156
+ include:
157
+ - platform: darwin-arm64
158
+ os: macos-15
159
+ - platform: darwin-x64
160
+ os: macos-15-intel
161
+ - platform: win32-x64
162
+ os: windows-2022
163
+ runs-on: ${{ matrix.os }}
164
+ env:
165
+ MACOSX_DEPLOYMENT_TARGET: '11.0'
166
+ steps:
167
+ - uses: actions/checkout@v4
168
+ - uses: actions/setup-node@v4
169
+ with:
170
+ node-version: '22'
171
+ cache: npm
172
+ cache-dependency-path: packages/desktop/package-lock.json
173
+ - uses: actions/setup-python@v5
174
+ with:
175
+ python-version: '3.12'
176
+ - uses: dtolnay/rust-toolchain@stable
177
+ - uses: Swatinem/rust-cache@v2
178
+ with:
179
+ workspaces: packages/desktop/src-tauri -> target
180
+ shared-key: client-desktop-${{ matrix.platform }}
181
+ - id: signing
182
+ if: runner.os == 'macOS'
183
+ uses: ./.github/actions/client-apple-signing
184
+ with:
185
+ certificate: ${{ secrets.CRABCODE_SIGNING_CERTIFICATE_P12_BASE64 }}
186
+ password: ${{ secrets.CRABCODE_SIGNING_CERTIFICATE_PASSWORD }}
187
+ identity: ${{ secrets.CRABCODE_SIGNING_IDENTITY }}
188
+ - uses: actions/download-artifact@v4
189
+ with:
190
+ name: computer-use-${{ matrix.platform }}
191
+ path: native-bundles
192
+ - name: Restore native bundle
193
+ shell: bash
194
+ run: |
195
+ mkdir -p packages/computer-use/dist
196
+ tar -xzf native-bundles/computer-use-${{ matrix.platform }}.tar.gz -C packages/computer-use/dist
197
+ - run: npm ci
198
+ working-directory: packages/desktop
199
+ - name: Package and verify DMG or MSI
200
+ env:
201
+ CRABCODE_SIGNING_IDENTITY: ${{ steps.signing.outputs.identity }}
202
+ run: python scripts/package_clients.py desktop --platform ${{ matrix.platform }} --output dist/desktop
203
+ - uses: actions/upload-artifact@v4
204
+ with:
205
+ name: desktop-${{ matrix.platform }}-${{ github.run_number }}
206
+ path: dist/desktop/
207
+ if-no-files-found: error
208
+ retention-days: 30
209
+ overwrite: true
210
+ - name: Add download instructions
211
+ shell: bash
212
+ run: |
213
+ echo '## Desktop installer' >> "$GITHUB_STEP_SUMMARY"
214
+ echo 'Download **desktop-${{ matrix.platform }}-${{ github.run_number }}** from Artifacts. It contains the DMG or MSI and SHA256SUMS.' >> "$GITHUB_STEP_SUMMARY"
@@ -24,6 +24,11 @@ jobs:
24
24
  - uses: actions/setup-node@v4
25
25
  with:
26
26
  node-version: '22'
27
+ - name: Check release metadata and generated client types
28
+ run: |
29
+ python scripts/sync_version.py --check
30
+ python packages/vscode/scripts/gen-types.py --check
31
+ python -m unittest discover -s tests -p test_client_packaging.py -v
27
32
  - run: python -m pip install -e . fastapi pypdf python-multipart pytest
28
33
  - run: python -m unittest discover -s tests -p "test_windows*.py" -v
29
34
  - run: python -m pytest tests/test_cli_computer_use.py -q
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crabcode
3
- Version: 0.1.6
3
+ Version: 0.1.7
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,11 @@ 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
+ Downloadable Desktop DMG/MSI installers and platform/universal VSIXs are built
326
+ through **Actions → Client Packages → Run workflow**. See
327
+ [manual client packaging](CLIENT_PACKAGING.md) for downloads and signing.
328
+ Python Release publishing remains independent.
329
+
325
330
  In Desktop and the VS Code extension, every completed assistant reply can be
326
331
  forked into a new session. The new session opens immediately, preserves the
327
332
  conversation up to that reply, and shows its source session/title. Running
@@ -6,6 +6,13 @@
6
6
 
7
7
  > 整体参考 Claude Code 设计
8
8
 
9
+ ## 界面语言
10
+
11
+ Desktop 与 VS Code 插件支持简中、繁中、英语、日语、韩语、德语、法语、西班牙语、巴西葡萄牙语和俄语。
12
+ 默认跟随系统或编辑器语言,可在 **设置 → 常规 → 界面语言** 中切换;VS Code 也可设置 `crabcode.language`。
13
+ 切换会保留当前会话和未发送的输入。语言包随客户端离线提供,聊天内容、代码和模型回复保持原样。
14
+ VS Code 原生命令和扩展设置的文案跟随编辑器的显示语言。
15
+
9
16
  ## 架构
10
17
 
11
18
  - **crabcode-core**:核心引擎。负责 API 调用、工具执行、提示词构造、会话管理和 MCP 集成。对外暴露纯异步事件流接口,不依赖任何 I/O 或终端。
@@ -250,12 +250,20 @@ async def connect_session(session: Any) -> LocalComputerUse | None:
250
250
  backend = LocalComputerUse()
251
251
  if not backend.client.installed and backend.client.bundle is None:
252
252
  return None
253
+ session._computer_use_connecting = True
253
254
  try:
254
255
  await backend.connect()
255
256
  except ComputerUseError as exc:
256
257
  logger.warning("Computer Use unavailable: %s", exc)
257
258
  await backend.close()
258
259
  return None
260
+ except BaseException:
261
+ # REPL shutdown may cancel an in-flight bootstrap. Do not leave a
262
+ # heartbeat or partially connected backend behind.
263
+ await backend.close()
264
+ raise
265
+ finally:
266
+ session._computer_use_connecting = False
259
267
  session.computer_use_backend = backend
260
268
  session.computer_use_host_id = backend.host_id
261
269
  session.computer_use_enabled = True
@@ -267,6 +275,8 @@ def session_status(session: Any) -> str:
267
275
  backend = getattr(session, "computer_use_backend", None)
268
276
  host_id = getattr(session, "computer_use_host_id", None)
269
277
  if backend is None:
278
+ if getattr(session, "_computer_use_connecting", False):
279
+ return "starting"
270
280
  client = NativeClient()
271
281
  return "unavailable (run crabcode computer-use status)" if client.installed or client.bundle else "not installed"
272
282
  if not getattr(session, "computer_use_enabled", False):
@@ -594,6 +594,14 @@ def _configure_composer_layout(
594
594
  if not isinstance(root, HSplit) or not root.children:
595
595
  return
596
596
  main = root.children[0]
597
+ # Newer prompt_toolkit versions wrap the input in a conditional Frame.
598
+ # Follow its active branch before configuring our own frame and status.
599
+ while isinstance(main, ConditionalContainer):
600
+ main = (
601
+ main.content
602
+ if main.filter()
603
+ else getattr(main, "alternative_content", None)
604
+ )
597
605
  if not isinstance(main, FloatContainer) or not isinstance(main.content, HSplit):
598
606
  return
599
607
 
@@ -2228,10 +2236,21 @@ async def run_repl(
2228
2236
  session.on_tool_event = _on_tool_event
2229
2237
 
2230
2238
  computer_use = None
2239
+ computer_use_task: asyncio.Task[None] | None = None
2231
2240
  try:
2232
2241
  from crabcode_cli.computer_use import connect_session
2233
2242
 
2234
- computer_use = await connect_session(session)
2243
+ async def connect_computer_use() -> None:
2244
+ nonlocal computer_use
2245
+ try:
2246
+ computer_use = await connect_session(session)
2247
+ except Exception:
2248
+ logger.exception("Failed to connect optional Computer Use component")
2249
+
2250
+ # The optional native host can take tens of seconds to install, start,
2251
+ # or time out. Keep input and normal chat available while it connects;
2252
+ # ComputerUseTool reads the session's backend dynamically.
2253
+ computer_use_task = asyncio.create_task(connect_computer_use())
2235
2254
  if resume_session_id:
2236
2255
  await session.initialize()
2237
2256
  ok = await session.resume(resume_session_id)
@@ -2748,6 +2767,10 @@ async def run_repl(
2748
2767
  console.print()
2749
2768
  finally:
2750
2769
  with _shutdown_deadline():
2770
+ if computer_use_task is not None:
2771
+ computer_use_task.cancel()
2772
+ with contextlib.suppress(asyncio.CancelledError):
2773
+ await computer_use_task
2751
2774
  if background_consumer is not None:
2752
2775
  background_consumer.cancel()
2753
2776
  with contextlib.suppress(asyncio.CancelledError):
@@ -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.6"
4
+ version = "0.1.7"
5
5
  description = "CrabCode CLI - terminal frontend for CrabCode"
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
- "crabcode-core>=0.1.6",
8
+ "crabcode-core>=0.1.7",
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.6"
405
+ version = "0.1.7"
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.6"
426
+ version = "0.1.7"
427
427
  dependencies = [
428
428
  "cc",
429
429
  "crabcode-computer-use-core",
@@ -100,6 +100,13 @@ local UI side. The main extension forwards the Gateway URL using
100
100
  `vscode.env.asExternalUri`; the local companion owns native execution and the
101
101
  monitor. A remote machine's desktop is not selected implicitly.
102
102
 
103
+ The universal VS Code main extension also delegates to the local companion in
104
+ ordinary local windows. Companion platform VSIXs and the all-platform VSIX store
105
+ native bundles in `resources/computer-use/<platform>-<arch>/`; the Node client
106
+ selects the current platform. Desktop and Python keep the original flat layout.
107
+ The manual **Client Packages** workflow builds all VSIXs and Desktop DMG/MSI
108
+ installers from the same native bundles. See [client packaging](../../CLIENT_PACKAGING.md).
109
+
103
110
  ## CLI
104
111
 
105
112
  Platform Python wheels for macOS (arm64 / x86_64) and Windows x64 include the
@@ -185,11 +192,13 @@ component already installed by CLI, Desktop or another CrabCode extension.
185
192
  The local companion uses the same native build command from its own package
186
193
  directory.
187
194
 
188
- Desktop's Tauri build hook and both VS Code extensions' `vscode:prepublish`
189
- scripts include the native component. Package platform-specific VSIX files;
190
- build Windows binaries on Windows and macOS binaries on macOS, matching the
191
- target architecture. `--out` selects a client resource directory. Release
192
- builds are the default; `--debug` is intended for development only.
195
+ Desktop's ordinary Tauri build hook builds the native component. The manual
196
+ Client Packages workflow builds it separately on each native runner and stages
197
+ the resulting bundles into VSIXs and Desktop installers. VS Code prepublish hooks
198
+ only build JavaScript, so they cannot replace a prebuilt multi-platform payload.
199
+ Build Windows binaries on Windows and macOS binaries on macOS, matching the
200
+ target architecture. `--out` selects a client resource directory. Release builds
201
+ are the default; `--debug` is intended for development only.
193
202
 
194
203
  The core's ignored macOS tests exercise live input and need an unlocked GUI
195
204
  and OS permissions. The opt-in `scripts/live-smoke.py` uses the real Gateway
@@ -44,7 +44,19 @@ class NativeComputerUse {
44
44
  async start() {
45
45
  if (this.starting) return this.starting;
46
46
  this.starting = (async () => {
47
- let executable = bundledExecutable(this.bundleDirectory);
47
+ // Platform VSIXs and the all-platform VSIX use the same directory layout.
48
+ // Keep the flat layout for Desktop, Python and existing source builds.
49
+ const platformBundle = path.join(this.bundleDirectory, `${process.platform}-${process.arch}`);
50
+ let executable = bundledExecutable(platformBundle);
51
+ let platformPayload = true;
52
+ try { await fs.access(executable); }
53
+ catch { platformPayload = false; executable = bundledExecutable(this.bundleDirectory); }
54
+ if (platformPayload) {
55
+ const manifest = JSON.parse(await fs.readFile(path.join(platformBundle, 'runtime.json'), 'utf8'));
56
+ if (manifest.platform !== process.platform || manifest.arch !== process.arch || manifest.protocol_version !== 1) {
57
+ throw new Error('Computer Use 原生组件的平台或协议不匹配,请重新安装当前平台的扩展。');
58
+ }
59
+ }
48
60
  try { await fs.access(executable); }
49
61
  catch {
50
62
  executable = bundledExecutable(this.stateDir);
@@ -1,4 +1,4 @@
1
- export interface ComputerUseHostOptions { gatewayUrl: string; password?: string; hostId: string; enabled: boolean }
1
+ export interface ComputerUseHostOptions { gatewayUrl: string; password?: string; hostId: string; enabled: boolean; language?: string }
2
2
  export interface ComputerUseBinding { hostId: string; enabled: boolean }
3
3
  export class VSCodeComputerUseHost {
4
4
  constructor(vscode: any, WebSocket: any, bundleDirectory: string);
@@ -0,0 +1,131 @@
1
+ import { setLocale, getLocale } from "../../shared/i18n/index.js";
2
+ import { t as tr, html as trHtml, localized } from "../../shared/i18n/index.js";
3
+ import { nodeComputerUseChannel } from './nodeChannel.js';
4
+ import { computerUseReauthorizationHint, initialComputerUseState } from './channel.js';
5
+
6
+ const escape = value => String(value ?? '').replace(/[&<>"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[char]);
7
+ const labels = localized({ disabled: '已关闭', connecting: '正在连接', unavailable: '不可用', ready: '可用', busy: '正在操作', error: '错误' });
8
+
9
+ /** UI host shared by the ordinary extension and the local Remote SSH companion. */
10
+ export class VSCodeComputerUseHost {
11
+ constructor(vscode, WebSocket, bundleDirectory) {
12
+ this.vscode = vscode;
13
+ setLocale(vscode.workspace?.getConfiguration("crabcode").get("language", "auto") || "auto", [vscode.env?.language || "zh-CN"]);
14
+ this.WebSocket = WebSocket;
15
+ this.bundleDirectory = bundleDirectory;
16
+ this.state = initialComputerUseState('', false);
17
+ this.render();
18
+ }
19
+
20
+ configure(options) {
21
+ setLocale(options.language || "auto", [this.vscode.env?.language || "zh-CN"]);
22
+ const identity = JSON.stringify([options.gatewayUrl, options.password, options.hostId]);
23
+ if (!this.runtime || this.identity !== identity) {
24
+ this.runtime?.channel.dispose();
25
+ this.identity = identity;
26
+ this.state = initialComputerUseState(options.hostId, options.enabled);
27
+ this.runtime = nodeComputerUseChannel({ ...options, WebSocket: this.WebSocket, bundleDirectory: this.bundleDirectory,
28
+ onState: state => { this.state = state; this.render(); } });
29
+ void this.runtime.channel.connect();
30
+ } else this.runtime.channel.setEnabled(options.enabled);
31
+ this.render();
32
+ return { hostId: options.hostId, enabled: options.enabled };
33
+ }
34
+
35
+ get statusLabel() {
36
+ const limited = this.state.status === 'ready' && (this.state.capabilities?.input_available === false || this.state.capabilities?.capture_available === false);
37
+ return limited ? tr("有限可用") : labels[this.state.status];
38
+ }
39
+
40
+ get capturePermissionHint() {
41
+ return this.state.capabilities?.platform === 'macos' && this.state.capabilities.capture_available === false
42
+ ? tr(computerUseReauthorizationHint(this.state.capabilities, 'screen_recording')) + tr("窗口列表和截图需要录屏权限。选择「打开录屏权限设置」后,将弹出的 Crab Computer Use.app 卡片拖到录屏列表并打开开关;也可点+,按 ⌘⇧G 输入 ~/Library/Application Support/CrabCode/ComputerUse/Crab Computer Use.app 后添加。Crab Desktop 或 VS Code 的授权不能代替此组件的授权。完成后选择「重新检测组件与权限」。")
43
+ : '';
44
+ }
45
+
46
+ get accessibilityPermissionHint() {
47
+ return this.state.capabilities?.platform === 'macos' && this.state.capabilities.input_available === false
48
+ ? tr(computerUseReauthorizationHint(this.state.capabilities, 'accessibility')) + tr("点击、输入和滚动需要辅助功能权限。选择「打开辅助功能权限设置」后,将弹出的 Crab Computer Use.app 卡片拖到辅助功能列表并打开开关;完成后选择「重新检测组件与权限」。")
49
+ : '';
50
+ }
51
+
52
+ render() {
53
+ if (this.statusPanel) this.renderStatus();
54
+ if (!this.panel) return;
55
+ const previews = this.state.previews.map(preview => {
56
+ const frame = preview.frame;
57
+ const safeFrame = frame && ['image/png', 'image/jpeg', 'image/webp'].includes(frame.media_type) && /^[A-Za-z0-9+/=\r\n]*$/.test(frame.data);
58
+ return `<article><h3>${escape(preview.sessionId)} · ${escape(preview.agentId || tr("主 Agent"))}</h3>
59
+ <p>${escape(preview.summary)} · ${preview.deliveryPolicy === 'strict_background' ? tr("严格后台") : tr("允许前台")}</p>
60
+ ${safeFrame ? `<img alt="${escape(tr("Computer Use 监看截图"))}" src="data:${frame.media_type};base64,${frame.data}" />` : trHtml("<p>暂无监看截图</p>")}
61
+ ${preview.observationKind?.includes('ax') ? trHtml("<p>本次模型读取 AX Tree;上图仅供监看。</p>") : ''}</article>`;
62
+ }).join('');
63
+ this.panel.webview.html = (trHtml("<!doctype html><html lang=\"" + getLocale() + "\"><head><meta charset=\"utf-8\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; img-src data:; style-src 'unsafe-inline';\">\n <style>body{font-family:var(--vscode-font-family);padding:16px;color:var(--vscode-foreground)}article{border:1px solid var(--vscode-panel-border);padding:12px;margin:12px 0}img{max-width:100%;max-height:65vh;object-fit:contain}li{margin:8px 0}p{overflow-wrap:anywhere}</style></head>\n <body><h2>Computer Use · ") + (this.statusLabel) + trHtml("</h2><p>") + (escape(this.state.error || tr("等待 Agent 开始操作电脑"))) + trHtml("</p>\n ") + (this.accessibilityPermissionHint ? `<p>${escape(this.accessibilityPermissionHint)}</p>` : '') + trHtml("\n ") + (this.capturePermissionHint ? `<p>${escape(this.capturePermissionHint)}</p>` : '') + trHtml("\n ") + (previews) + trHtml("<h3>操作记录</h3><ul>") + ([...this.state.logs].reverse().map(entry => `<li>${escape(new Date(entry.time).toLocaleTimeString(getLocale()))} · ${escape(entry.summary)}</li>`).join('')) + trHtml("</ul></body></html>"));
64
+ }
65
+
66
+ renderStatus() {
67
+ const capabilities = this.state.capabilities;
68
+ const availability = value => value === true ? tr("可用") : value === false ? tr("不可用") : tr("未检测");
69
+ const platforms = { macos: 'macOS', darwin: 'macOS', windows: 'Windows', win32: 'Windows', linux: 'Linux' };
70
+ const rows = [
71
+ [tr("启用状态"), this.state.enabled ? tr("已启用") : tr("已关闭")],
72
+ [tr("当前状态"), this.statusLabel],
73
+ [tr("正在操作电脑"), this.state.active ? tr("是") : tr("否")],
74
+ [tr("操作系统"), platforms[capabilities?.platform] || capabilities?.platform || tr("未检测")],
75
+ [tr("图形界面"), availability(capabilities?.gui_available)],
76
+ [tr("键鼠输入"), availability(capabilities?.input_available)],
77
+ [tr("屏幕截图"), availability(capabilities?.capture_available)],
78
+ [tr("辅助功能读取(AX)"), availability(capabilities?.ax_available)],
79
+ [tr("严格后台输入"), availability(capabilities?.strict_background_input_available)],
80
+ [tr("显示器数量"), capabilities ? String(capabilities.displays?.length ?? 0) : tr("未检测")],
81
+ ];
82
+ const notes = [...new Set([this.capturePermissionHint, this.accessibilityPermissionHint, this.state.error, capabilities?.reason, capabilities?.strict_background_reason].filter(Boolean))];
83
+ this.statusPanel.webview.html = (trHtml("<!doctype html><html lang=\"" + getLocale() + "\"><head><meta charset=\"utf-8\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline';\">\n <style>body{font-family:var(--vscode-font-family);padding:16px;color:var(--vscode-foreground);max-width:720px}dl{display:grid;grid-template-columns:minmax(120px,1fr) 2fr;gap:0}dt,dd{margin:0;padding:12px 0;border-bottom:1px solid var(--vscode-panel-border);overflow-wrap:anywhere}dt{color:var(--vscode-descriptionForeground);padding-right:16px}p{line-height:1.6;overflow-wrap:anywhere}</style></head>\n <body><h2>Computer Use 状态</h2><dl>") + (rows.map(([name, value]) => `<dt>${escape(name)}</dt><dd>${escape(value)}</dd>`).join('')) + trHtml("</dl>\n ") + (notes.map(note => `<p>${escape(note)}</p>`).join('')) + trHtml("\n <p>") + (!this.state.enabled && capabilities ? tr("Computer Use 已关闭,权限信息为上次检测结果。") : tr("状态随连接与权限检测结果自动更新。")) + trHtml("如需重新检查权限,请在 Computer Use 菜单选择「重新检测组件与权限」。</p></body></html>"));
84
+ }
85
+
86
+ async menu() {
87
+ const permissionChoices = this.state.capabilities?.platform === 'macos'
88
+ ? [
89
+ { label: tr("打开录屏权限设置"), action: 'screen_recording_permissions' },
90
+ { label: tr("打开辅助功能权限设置"), action: 'accessibility_permissions' },
91
+ ]
92
+ : [{ label: tr("打开系统权限设置"), action: 'permissions' }];
93
+ const choice = await this.vscode.window.showQuickPick([
94
+ { label: tr("Computer Use 状态查询"), action: 'status' },
95
+ { label: this.state.enabled ? tr("关闭 Computer Use") : tr("启用 Computer Use"), action: 'toggle' },
96
+ { label: tr("查看监看截图和操作记录"), action: 'monitor' },
97
+ { label: tr("重新检测组件与权限"), action: 'refresh' },
98
+ ...permissionChoices,
99
+ ], { title: `Computer Use · ${this.statusLabel}` });
100
+ if (!choice) return;
101
+ try {
102
+ if (choice.action === 'toggle') {
103
+ const config = this.vscode.workspace.getConfiguration('crabcode');
104
+ const target = config.inspect('computerUseEnabled')?.workspaceValue !== undefined
105
+ ? this.vscode.ConfigurationTarget.Workspace : this.vscode.ConfigurationTarget.Global;
106
+ await config.update('computerUseEnabled', !this.state.enabled, target);
107
+ } else if (choice.action === 'refresh') this.runtime?.channel.refresh();
108
+ else if (choice.action === 'screen_recording_permissions') await this.runtime?.openPermissions('screen_recording');
109
+ else if (choice.action === 'accessibility_permissions') await this.runtime?.openPermissions('accessibility');
110
+ else if (choice.action === 'permissions') await this.runtime?.openPermissions();
111
+ else if (choice.action === 'status') {
112
+ if (this.statusPanel) return this.statusPanel.reveal();
113
+ this.statusPanel = this.vscode.window.createWebviewPanel('crabcode.computerUseStatus', tr("Computer Use 状态"), this.vscode.ViewColumn.Beside, { enableScripts: false });
114
+ this.statusPanel.onDidDispose(() => { this.statusPanel = null; });
115
+ this.renderStatus();
116
+ }
117
+ else if (choice.action === 'monitor') {
118
+ if (this.panel) return this.panel.reveal();
119
+ this.panel = this.vscode.window.createWebviewPanel('crabcode.computerUseMonitor', 'Computer Use', this.vscode.ViewColumn.Beside, { enableScripts: false });
120
+ this.panel.onDidDispose(() => { this.panel = null; });
121
+ this.render();
122
+ }
123
+ } catch (error) { void this.vscode.window.showErrorMessage(String(error.message || error)); }
124
+ }
125
+
126
+ dispose() {
127
+ this.runtime?.channel.dispose();
128
+ this.panel?.dispose();
129
+ this.statusPanel?.dispose();
130
+ }
131
+ }
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "crabcode-computer-use-core"
3
- version = "0.1.6"
3
+ version = "0.1.7"
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.6"
3
+ version = "0.1.7"
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.6"
3
+ VERSION = "0.1.7"