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.
- crabcode-0.1.7/.github/actions/client-apple-signing/action.yml +51 -0
- crabcode-0.1.7/.github/workflows/client-packages.yml +214 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/windows-compat.yml +5 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/PKG-INFO +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/README.md +5 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/README.zh-CN.md +7 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/computer_use.py +10 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/repl.py +24 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/pyproject.toml +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/Cargo.lock +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/README.md +14 -5
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nativeClient.cjs +13 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/vscodeHost.d.ts +1 -1
- crabcode-0.1.7/packages/computer-use/client/vscodeHost.js +131 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/Cargo.toml +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/Cargo.toml +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/_version.py +1 -1
- crabcode-0.1.7/packages/core/crabcode_core/api/model_discovery.py +136 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/model_info.py +11 -5
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/pyproject.toml +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/pyproject.toml +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/README.md +9 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/package-lock.json +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/package.json +5 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.startup.test.tsx +4 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.test.tsx +14 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/App.tsx +608 -596
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ApprovalShortcutSettings.tsx +16 -15
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReview.tsx +16 -17
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReviewControls.tsx +24 -23
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ComposerEditor.tsx +16 -14
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ConversationTurns.tsx +8 -7
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/CopyButton.tsx +5 -4
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentViewTabs.tsx +6 -6
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.files.test.tsx +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.tsx +103 -103
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FileEditSummaryCard.tsx +6 -9
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FollowUpQueue.tsx +13 -12
- crabcode-0.1.7/packages/desktop/src/GroupModelDiscovery.test.tsx +66 -0
- crabcode-0.1.7/packages/desktop/src/GroupModelDiscovery.tsx +113 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ModelSettingsPanel.test.tsx +2 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ModelSettingsPanel.tsx +117 -77
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ProjectFilesWorkspace.tsx +52 -50
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PromptSettingsPanel.test.tsx +6 -4
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PromptSettingsPanel.tsx +68 -65
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ReviewMenu.tsx +5 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/RuntimeSettingsPanel.tsx +60 -61
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SettingsView.test.tsx +32 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SettingsView.tsx +264 -243
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/StatusBar.tsx +80 -78
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TrajectoryView.test.tsx +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TrajectoryView.tsx +41 -39
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TurnDetailsButton.tsx +6 -5
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.tsx +76 -81
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/VirtualMachineSettings.tsx +65 -65
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/approvalShortcuts.ts +2 -1
- crabcode-0.1.7/packages/desktop/src/desktopSlashCommands.ts +116 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/events.ts +17 -16
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/favorites.ts +2 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gateway.ts +14 -4
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayStartup.ts +9 -8
- crabcode-0.1.7/packages/desktop/src/i18n.ts +11 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/lumeInstaller.ts +3 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/main.tsx +3 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.test.ts +9 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.ts +18 -15
- crabcode-0.1.7/packages/desktop/src/permissionPresentation.ts +65 -0
- {crabcode-0.1.6/packages/vscode → crabcode-0.1.7/packages/desktop}/src/promptTemplateFile.ts +16 -16
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/sessionNotifications.ts +7 -6
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/styles.css +109 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/theme.ts +30 -29
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/themePackages.ts +43 -42
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/toolPresentation.ts +12 -11
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/turnDetails.ts +17 -15
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/types.ts +8 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useGitReview.ts +4 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/userPromptDisplay.ts +8 -7
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/Cargo.lock +3 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/Cargo.toml +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/settings.rs +1 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/tauri.conf.json +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/config.py +54 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/schemas.py +8 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/pyproject.toml +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/pyproject.toml +2 -2
- crabcode-0.1.7/packages/shared/i18n/README.md +50 -0
- crabcode-0.1.7/packages/shared/i18n/index.d.ts +28 -0
- crabcode-0.1.7/packages/shared/i18n/index.js +22 -0
- crabcode-0.1.7/packages/shared/i18n/locales/de.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/en.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/es.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/fr.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/ja.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/ko.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/pt-BR.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/ru.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/zh-CN.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/locales/zh-TW.json +2866 -0
- crabcode-0.1.7/packages/shared/i18n/metadata.d.ts +2 -0
- crabcode-0.1.7/packages/shared/i18n/metadata.js +6 -0
- crabcode-0.1.7/packages/shared/i18n/runtime.js +64 -0
- crabcode-0.1.7/packages/shared/i18n/runtime.test.mjs +67 -0
- crabcode-0.1.7/packages/shared/package.json +7 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/slashCommands.d.ts +1 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/slashCommands.js +133 -131
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscode/launch.json +2 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscodeignore +1 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/README.md +34 -7
- crabcode-0.1.7/packages/vscode/computer-use/README.md +22 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/package-lock.json +2 -2
- crabcode-0.1.7/packages/vscode/computer-use/package.json +36 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.de.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.es.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.fr.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.ja.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.ko.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.pt-br.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.ru.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.zh-cn.json +3 -0
- crabcode-0.1.7/packages/vscode/computer-use/package.nls.zh-tw.json +3 -0
- crabcode-0.1.7/packages/vscode/logo.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/package-lock.json +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/package.json +97 -60
- crabcode-0.1.7/packages/vscode/package.nls.de.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.es.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.fr.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.ja.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.ko.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.pt-br.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.ru.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.zh-cn.json +68 -0
- crabcode-0.1.7/packages/vscode/package.nls.zh-tw.json +68 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/scripts/gen-types.py +20 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/chatPanel.ts +560 -528
- crabcode-0.1.7/packages/vscode/src/client/permissionPresentation.ts +52 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/client/types.ts +21 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/computerUse.ts +12 -22
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/crabCodeSettingsPanel.ts +33 -22
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/extension.ts +32 -25
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/gatewayManager.ts +109 -77
- crabcode-0.1.7/packages/vscode/src/i18n.ts +10 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/ideContext.ts +8 -7
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/pendingEdits.ts +19 -18
- {crabcode-0.1.6/packages/desktop → crabcode-0.1.7/packages/vscode}/src/promptTemplateFile.ts +16 -16
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/runtimeControls.ts +4 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/catalog.ts +19 -10
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/protocol.ts +3 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/webview.css +115 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/settings/webview.ts +465 -199
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseController.test.cjs +19 -7
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseNative.test.cjs +28 -3
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/contextUsage.test.cjs +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/crabCodeSettingsPanel.test.cjs +58 -0
- crabcode-0.1.7/packages/vscode/tests/gatewayManager.test.cjs +265 -0
- crabcode-0.1.7/packages/vscode/tests/helpers/i18n.cjs +12 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/settingsHarness.cjs +4 -1
- crabcode-0.1.7/packages/vscode/tests/i18n.test.cjs +111 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/imageCaptions.test.cjs +2 -2
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/permissionPolicy.test.cjs +11 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/streamRetry.test.cjs +1 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/pyproject.toml +1 -1
- {crabcode-0.1.6 → crabcode-0.1.7}/scripts/audit_tool_cards.mjs +4 -3
- crabcode-0.1.7/scripts/i18n.mjs +107 -0
- crabcode-0.1.7/scripts/package_clients.py +339 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/scripts/sync_version.py +17 -11
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_composer.py +39 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_computer_use.py +95 -0
- crabcode-0.1.7/tests/test_client_packaging.py +254 -0
- crabcode-0.1.7/tests/test_model_discovery.py +200 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_info.py +2 -2
- crabcode-0.1.6/packages/computer-use/client/vscodeHost.js +0 -138
- crabcode-0.1.6/packages/desktop/src/desktopSlashCommands.ts +0 -115
- crabcode-0.1.6/packages/desktop/src/permissionPresentation.ts +0 -64
- crabcode-0.1.6/packages/shared/package.json +0 -4
- crabcode-0.1.6/packages/vscode/computer-use/README.md +0 -19
- crabcode-0.1.6/packages/vscode/computer-use/package.json +0 -20
- crabcode-0.1.6/packages/vscode/logo.png +0 -0
- crabcode-0.1.6/packages/vscode/src/client/permissionPresentation.ts +0 -64
- crabcode-0.1.6/packages/vscode/tests/gatewayManager.test.cjs +0 -114
- {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/computer-use.yml +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/document-engine-wheels.yml +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/.github/workflows/python-publish.yml +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/.gitignore +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/__main__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/app.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/banner.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/model_manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/model_picker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/pipe.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/render/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/render/messages.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/crabcode_cli/session_picker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/cli/hatch_build.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/Cargo.toml +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/build.mjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/channel.d.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/channel.js +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nativeClient.d.cts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nodeChannel.d.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/nodeChannel.js +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/package.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/client/src/channel.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_experiment.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_input/tests.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_input.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/background_profiles.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/diagnostics.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_accessibility/tests.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_accessibility.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/mac_ax_relations.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/policy.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/regression_tests.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_lifecycle.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_observation.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/window_relations.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_clipboard.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_focus.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use/windows_input.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/computer_use.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/src/lib.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/background_page.html +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/keyboard_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/popup_observation_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/save_panel_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/scaled_ax_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/scroll_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/core/tests/fixtures/window_group_host.swift +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/build.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/lib.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/main.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/src/permission_guide.m +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/host/windows.rc +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/PROMPT.md +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.icns +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.ico +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/icons/icon.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/build-icons.mjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/build.mjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/check-wheel.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/computer-use/scripts/live-smoke.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/_windows_process.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/agent_manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/anthropic_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/azure_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/base.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/codex_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/error_logging.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/gemini_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/network.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/ollama_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/openai_adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/api/registry.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/command_line.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/compact.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/compact/context_tokens.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/computer_use_mode.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/computer_use_observation.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/claudemd.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/config/model_catalog.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/events.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/file_lock.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/filesystem.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/goal.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/hooks/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/hooks/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/image_io.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/io_worker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/logging_utils.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/client.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/diagnostics.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/lsp/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/client.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/mcp/config.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/path_validation.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/paths.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/peer/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/peer/runtime.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/ai_reviewer.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/permissions/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/executor.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/plan/types.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/blocks.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/context.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/library.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/profile.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/system.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/prompts/templates.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/computer_use_history.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/loop.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/query/retry.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/models.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/store.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/schedule/timing.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/export.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/meta_db.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/storage.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/session/title_gen.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/context.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/loader.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/skills/matcher.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/snapshot.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/snapshot/tracker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/subprocess_utils.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/bridge.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/inbox.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/manager.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/message_bus.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/models.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/team/recovery.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/text_io.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/_input_helpers.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/_input_schema.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/agent.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/apply_patch.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/ask_user.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/bash.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/browser.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/checklist.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/checkpoint.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/computer_use.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/diff_utils.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_edit.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_read.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/file_write.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/glob.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/goal.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/grep.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/image.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/image_generate.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/lint.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/loading.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/memory.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/monitor.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/peer.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/revert.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/schedule.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/skill.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/switch_mode.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/team.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/tool_search.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/tools/web_search.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/turn_details.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/config.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/event.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/message.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/types/tool.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/usage.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/core/crabcode_core/utf8_sanitize.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/adapters.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/dap.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/memory.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/process.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/runtime.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/sessions.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/debugger/crabcode_debugger/tool.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/THEMES.md +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/index.html +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReview.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ChangeReviewControls.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ComposerEditor.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ConversationTurns.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.blog.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.selection.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/DocumentWorkspace.toolbar.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FileEditSummaryCard.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/FollowUpQueue.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/PermissionPicker.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/ProjectFilesWorkspace.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SlidingTabIndicator.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/SlidingTabIndicator.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/StatusBar.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/TurnDetailsButton.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.css +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/UsageSettingsPanel.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/VirtualMachineSettings.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/approvalShortcuts.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/computerUse.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/computerUse.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/desktopSlashCommands.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/diffRows.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/events.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/favorites.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/fileEditSummary.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/fileEditSummary.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gateway.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayErrors.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/gatewayStartup.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/lumeInstaller.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/markdownMath.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.lume.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/native.startup.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/pathUtils.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/platform.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/promptTemplateFile.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/reviewHistory.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/sessionNotifications.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/taskbarProgress.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/taskbarProgress.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/theme.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/themePackages.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/toolPresentation.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useGitReview.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useProjectModels.test.tsx +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/useProjectModels.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/userPromptDisplay.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/uuid.test.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/uuid.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/virtualMachine.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src/vite-env.d.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/build.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/capabilities/default.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/128x128.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/128x128@2x.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/32x32.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.icns +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.ico +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/icons/icon.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/resources/dock-icon-light.png +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/computer_use.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/gateway.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/gateway_runtime_tests.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/lib.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/main.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/paths.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/forwards.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/guest.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine/installer.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/src/virtual_machine.rs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/src-tauri/tests/fixtures/gateway_python.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/tsconfig.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/desktop/vite.config.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/agent.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/session.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/transport.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/acp/types.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/adapter.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/auth.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/computer_use.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/document_engine.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/document_worker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/event_bus.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/crabcode_pb2_grpc.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/proto/crabcode.proto +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/grpc/server.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/middleware.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/protocol.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/agent.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/auth.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/computer_use.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/document.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/event.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/git_review.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/health.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/peer.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/permission.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/schedule.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/session.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/snapshot.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/tasks.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/team.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/usage.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/routes/workspace.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/safe_file.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/server.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/session_registry.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/task_registry.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/gateway/crabcode_gateway/turn_details.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/__init__.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/background.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/chunker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/embedder.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/indexer.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/store.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/search/crabcode_search/tool.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/turnProcess.d.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/shared/turnProcess.js +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.gitignore +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.nvmrc +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/.vscode/tasks.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/CHANGELOG.md +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/LICENSE +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/.vscodeignore +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/LICENSE +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/esbuild.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/computer-use/extension.js +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/esbuild.js +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/resources/icon.svg +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/client/protocol.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/src/connection.ts +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUseHost.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/computerUsePolicy.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/followUp.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/chatPanelHarness.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/slashCommands.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/helpers/turnProcess.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/ideContext.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/runtimeControls.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/slashCommands.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/turnDetails.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tests/turnProcess.test.cjs +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tsconfig.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/packages/vscode/tsconfig.webview.json +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/scripts/build_document_engine_bundle.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/scripts/prompt_budget.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_api_error_logging.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_apply_patch.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_api_recovery.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_model_management.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_model_picker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_session_picker.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_cli_yolo.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_codex_context_window.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_compact_prompt.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_compaction_settings.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_ax.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_history.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_observation.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_packaging.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_policy.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_computer_use_window_observations.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_config_home.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_context_token_accounting.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_follow_up_messages.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_new_session_controls.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_runtime_info.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_gateway_send_message.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_git_review.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_image_context.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_image_tool.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_io_isolation.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_connection.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_model_settings_delete.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_network_policy.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_openai_tool_images.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_permission_policy_status.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_project_model_catalog.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_prompt_loading.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_prompt_settings.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_read_images.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_reasoning_effort.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_resume_model.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_session_storage_performance.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_stream_reconnect.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_tool_loading.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_turn_details.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_usage.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_web_search.py +0 -0
- {crabcode-0.1.6 → crabcode-0.1.7}/tests/test_windows_audit_regressions.py +0 -0
- {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
|
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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 => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[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
|
+
}
|