@toddzheng024/dscode-desktop 0.0.0-stage → 0.7.34
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.
- package/LICENSE +21 -0
- package/README.md +120 -2
- package/THIRD_PARTY_NOTICES.md +30 -0
- package/bin/apply_patch +9 -0
- package/cordis.patch.yml +433 -0
- package/docs/CHANGELOG.md +649 -0
- package/docs/account-login.md +44 -0
- package/docs/auto-review.md +128 -0
- package/docs/browser-use.md +784 -0
- package/docs/computer-use.md +81 -0
- package/docs/custom-providers.md +88 -0
- package/docs/demo.md +158 -0
- package/docs/distribution.md +58 -0
- package/docs/dscode-ultra.md +75 -0
- package/docs/email.md +296 -0
- package/docs/exec.md +40 -0
- package/docs/hub-distribution.md +212 -0
- package/docs/memory.md +121 -0
- package/docs/opencode-go.md +61 -0
- package/docs/plugin-hub.md +68 -0
- package/docs/releases/0.2.0.md +28 -0
- package/docs/releases/0.3.0.md +21 -0
- package/docs/releases/0.4.0.md +20 -0
- package/docs/releases/0.5.0.md +19 -0
- package/docs/releases/0.6.0.md +20 -0
- package/docs/releases/0.7.0.md +22 -0
- package/docs/releases/0.7.1.md +20 -0
- package/docs/releases/0.7.10.md +10 -0
- package/docs/releases/0.7.11.md +17 -0
- package/docs/releases/0.7.12.md +11 -0
- package/docs/releases/0.7.13.md +12 -0
- package/docs/releases/0.7.14.md +11 -0
- package/docs/releases/0.7.15.md +11 -0
- package/docs/releases/0.7.16.md +10 -0
- package/docs/releases/0.7.17.md +12 -0
- package/docs/releases/0.7.18.md +13 -0
- package/docs/releases/0.7.19.md +8 -0
- package/docs/releases/0.7.2.md +19 -0
- package/docs/releases/0.7.20.md +10 -0
- package/docs/releases/0.7.21.md +9 -0
- package/docs/releases/0.7.22.md +11 -0
- package/docs/releases/0.7.23.md +14 -0
- package/docs/releases/0.7.24.md +11 -0
- package/docs/releases/0.7.25.md +8 -0
- package/docs/releases/0.7.26.md +18 -0
- package/docs/releases/0.7.27.md +8 -0
- package/docs/releases/0.7.28.md +22 -0
- package/docs/releases/0.7.29.md +12 -0
- package/docs/releases/0.7.3.md +23 -0
- package/docs/releases/0.7.30.md +19 -0
- package/docs/releases/0.7.31.md +14 -0
- package/docs/releases/0.7.32.md +14 -0
- package/docs/releases/0.7.33.md +37 -0
- package/docs/releases/0.7.34.md +24 -0
- package/docs/releases/0.7.4.md +16 -0
- package/docs/releases/0.7.5.md +18 -0
- package/docs/releases/0.7.6.md +29 -0
- package/docs/releases/0.7.7.md +36 -0
- package/docs/releases/0.7.8.md +14 -0
- package/docs/releases/0.7.9.md +15 -0
- package/docs/session-bridge.md +80 -0
- package/docs/session-cards.md +53 -0
- package/docs/session-communication.md +186 -0
- package/docs/session-metrics.md +41 -0
- package/docs/skills.md +81 -0
- package/docs/triggers.md +338 -0
- package/docs/tui-commands.md +204 -0
- package/extensions/browser/manifest.json +22 -0
- package/extensions/browser/popup.css +6 -0
- package/extensions/browser/popup.html +11 -0
- package/extensions/browser/popup.mjs +47 -0
- package/extensions/browser/protocol.mjs +168 -0
- package/extensions/browser/worker.mjs +94 -0
- package/icon.svg +7 -0
- package/locale/en.json +6 -0
- package/locale/zh-cn.json +6 -0
- package/node_modules/@deepseek-ai/node-addon-system/LICENSE +21 -0
- package/node_modules/@deepseek-ai/node-addon-system/README.i18n.yaml +6 -0
- package/node_modules/@deepseek-ai/node-addon-system/README.md +15 -0
- package/node_modules/@deepseek-ai/node-addon-system/README.zh.md +15 -0
- package/node_modules/@deepseek-ai/node-addon-system/lib/flock.d.ts +13 -0
- package/node_modules/@deepseek-ai/node-addon-system/lib/flock.js +51 -0
- package/node_modules/@deepseek-ai/node-addon-system/lib/index.d.ts +73 -0
- package/node_modules/@deepseek-ai/node-addon-system/lib/index.js +98 -0
- package/node_modules/@deepseek-ai/node-addon-system/package.json +45 -0
- package/node_modules/@deepseek-ai/node-addon-system/src/flock.c +164 -0
- package/node_modules/@deepseek-ai/node-addon-system/src/main.c +298 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/LICENSE +28 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.i18n.yaml +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.md +9 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.zh.md +9 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/bin/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/package.json +31 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/prebuilds.json +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/LICENSE +28 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.i18n.yaml +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.md +9 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.zh.md +9 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/bin/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/package.json +31 -0
- package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/prebuilds.json +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/LICENSE +28 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.i18n.yaml +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.md +11 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.zh.md +11 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/glibc/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/landlock-run +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/musl/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/package.json +31 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/prebuilds.json +24 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/LICENSE +28 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.i18n.yaml +6 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.md +11 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.zh.md +11 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/glibc/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/landlock-run +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/musl/system.node +0 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/package.json +31 -0
- package/node_modules/@deepseek-ai/node-addon-system-linux-x64/prebuilds.json +24 -0
- package/package.json +156 -4
- package/plugins/account/index.mjs +178 -0
- package/plugins/account/state.mjs +123 -0
- package/plugins/auto-review/audit.mjs +24 -0
- package/plugins/auto-review/index.mjs +267 -0
- package/plugins/auto-review/policy.mjs +92 -0
- package/plugins/browser/SKILL.md +158 -0
- package/plugins/browser/access.mjs +143 -0
- package/plugins/browser/config.mjs +60 -0
- package/plugins/browser/connection.mjs +385 -0
- package/plugins/browser/desktop-client.mjs +282 -0
- package/plugins/browser/desktop-host.mjs +74 -0
- package/plugins/browser/document-identity.mjs +57 -0
- package/plugins/browser/extension-relay.mjs +66 -0
- package/plugins/browser/files.mjs +32 -0
- package/plugins/browser/index.mjs +235 -0
- package/plugins/browser/mcp-entry.mjs +18 -0
- package/plugins/browser/mcp-tools.mjs +21 -0
- package/plugins/browser/presentation.mjs +45 -0
- package/plugins/browser/preview.mjs +77 -0
- package/plugins/browser/review.mjs +20 -0
- package/plugins/browser/screenshots.mjs +35 -0
- package/plugins/clipboard-image/clipboard-image.swift +56 -0
- package/plugins/clipboard-image/index.mjs +70 -0
- package/plugins/code-review/baseline.mjs +143 -0
- package/plugins/code-review/git.mjs +163 -0
- package/plugins/code-review/index.mjs +236 -0
- package/plugins/compaction/engine.mjs +304 -0
- package/plugins/compaction/tetris.mjs +65 -0
- package/plugins/compaction/threshold.mjs +99 -0
- package/plugins/computer-use/DESKTOP-SKILL.md +64 -0
- package/plugins/computer-use/desktop-host.mjs +75 -0
- package/plugins/computer-use/desktop-skill.mjs +28 -0
- package/plugins/computer-use/desktop-upstream.mjs +3 -0
- package/plugins/computer-use/index.mjs +37 -0
- package/plugins/cordis-config/plain.mjs +31 -0
- package/plugins/credentials/index.mjs +73 -0
- package/plugins/custom/adapter.mjs +110 -0
- package/plugins/custom/config.mjs +85 -0
- package/plugins/custom/desktop-client.mjs +150 -0
- package/plugins/custom/desktop-host.mjs +78 -0
- package/plugins/custom/images.mjs +32 -0
- package/plugins/custom/index.mjs +145 -0
- package/plugins/custom/wire.mjs +179 -0
- package/plugins/desktop/client.mjs +1041 -0
- package/plugins/desktop/index.mjs +10 -0
- package/plugins/desktop/shell-environment.mjs +9 -0
- package/plugins/desktop-workspace/hooks.mjs +29 -0
- package/plugins/desktop-workspace/index.mjs +37 -0
- package/plugins/dscode/board.mjs +260 -0
- package/plugins/dscode/child-target.mjs +11 -0
- package/plugins/dscode/control.mjs +17 -0
- package/plugins/dscode/desktop-client.mjs +55 -0
- package/plugins/dscode/desktop-host.mjs +37 -0
- package/plugins/dscode/index.mjs +270 -0
- package/plugins/email/cli.mjs +32 -0
- package/plugins/email/contacts.mjs +36 -0
- package/plugins/email/desktop-client.mjs +117 -0
- package/plugins/email/desktop-host.mjs +54 -0
- package/plugins/email/desktop-service.mjs +106 -0
- package/plugins/email/gmail-oauth.mjs +69 -0
- package/plugins/email/gmail-store.mjs +2 -0
- package/plugins/email/gmail.mjs +194 -0
- package/plugins/email/imap.mjs +136 -0
- package/plugins/email/inbox.d.mts +25 -0
- package/plugins/email/inbox.mjs +76 -0
- package/plugins/email/smtp.mjs +70 -0
- package/plugins/email/store.mjs +32 -0
- package/plugins/email-tools/index.mjs +46 -0
- package/plugins/exec/cli.mjs +64 -0
- package/plugins/exec/index.mjs +112 -0
- package/plugins/grok/adapter.mjs +114 -0
- package/plugins/grok/auth.mjs +76 -0
- package/plugins/grok/billing.mjs +147 -0
- package/plugins/grok/index.mjs +123 -0
- package/plugins/grok/models.mjs +129 -0
- package/plugins/grok/status.mjs +29 -0
- package/plugins/grok/wire.mjs +268 -0
- package/plugins/hub/catalog.mjs +82 -0
- package/plugins/hub/desktop-client.mjs +114 -0
- package/plugins/hub/desktop-host.mjs +129 -0
- package/plugins/i18n/messages.d.mts +21 -0
- package/plugins/i18n/messages.mjs +537 -0
- package/plugins/jev/approval.mjs +131 -0
- package/plugins/jev/client.mjs +74 -0
- package/plugins/jev/index.mjs +100 -0
- package/plugins/memory/content.mjs +57 -0
- package/plugins/memory/desktop-host.mjs +3 -0
- package/plugins/memory/index.mjs +168 -0
- package/plugins/memory/pipeline.mjs +79 -0
- package/plugins/memory/store.mjs +93 -0
- package/plugins/message-source/kind.mjs +20 -0
- package/plugins/opencode-go/adapter.mjs +96 -0
- package/plugins/opencode-go/command.mjs +128 -0
- package/plugins/opencode-go/index.mjs +121 -0
- package/plugins/opencode-go/models.mjs +58 -0
- package/plugins/opencode-go/oauth.mjs +194 -0
- package/plugins/opencode-go/search.mjs +86 -0
- package/plugins/opencode-go/usage.mjs +120 -0
- package/plugins/opencode-go/version.mjs +10 -0
- package/plugins/opencode-go/wire.mjs +73 -0
- package/plugins/openrouter/adapter.mjs +232 -0
- package/plugins/openrouter/index.mjs +124 -0
- package/plugins/openrouter/models.mjs +157 -0
- package/plugins/openrouter/search.mjs +113 -0
- package/plugins/openrouter/wire.mjs +101 -0
- package/plugins/providers/catalog.mjs +160 -0
- package/plugins/providers/chat-messages.mjs +120 -0
- package/plugins/providers/chat-stream.mjs +174 -0
- package/plugins/providers/desktop-client.mjs +84 -0
- package/plugins/providers/desktop-host.mjs +63 -0
- package/plugins/providers/effort.mjs +35 -0
- package/plugins/providers/http-errors.mjs +50 -0
- package/plugins/providers/openrouter-account.mjs +171 -0
- package/plugins/session-bridge/client.mjs +106 -0
- package/plugins/session-bridge/communication.mjs +260 -0
- package/plugins/session-bridge/index.mjs +67 -0
- package/plugins/session-bridge/mailbox.mjs +267 -0
- package/plugins/session-bridge/paths.mjs +21 -0
- package/plugins/session-bridge/server.mjs +172 -0
- package/plugins/session-bridge/tasks.mjs +229 -0
- package/plugins/session-cards/content.mjs +64 -0
- package/plugins/session-cards/index.mjs +38 -0
- package/plugins/session-cards/manager.mjs +140 -0
- package/plugins/session-metrics/attribution.mjs +30 -0
- package/plugins/session-metrics/balance.mjs +81 -0
- package/plugins/session-metrics/desktop-client.mjs +62 -0
- package/plugins/session-metrics/desktop-host.mjs +46 -0
- package/plugins/session-metrics/index.mjs +97 -0
- package/plugins/session-metrics/pricing.mjs +84 -0
- package/plugins/session-metrics/rate.mjs +59 -0
- package/plugins/session-metrics/store.mjs +75 -0
- package/plugins/session-metrics/turns.mjs +134 -0
- package/plugins/session-metrics/view.mjs +272 -0
- package/plugins/time-marks/desktop-host.mjs +2 -0
- package/plugins/time-marks/index.mjs +116 -0
- package/plugins/time-marks/marks.mjs +152 -0
- package/plugins/triggers/cli.mjs +558 -0
- package/plugins/triggers/commands.mjs +143 -0
- package/plugins/triggers/config.mjs +264 -0
- package/plugins/triggers/desktop-client.mjs +155 -0
- package/plugins/triggers/desktop-host.mjs +88 -0
- package/plugins/triggers/desktop-management.mjs +97 -0
- package/plugins/triggers/desktop-scheduler.mjs +125 -0
- package/plugins/triggers/host.mjs +24 -0
- package/plugins/triggers/index.mjs +27 -0
- package/plugins/triggers/job-cli.mjs +110 -0
- package/plugins/triggers/jobs.mjs +156 -0
- package/plugins/triggers/launchd.mjs +101 -0
- package/plugins/triggers/lease.mjs +24 -0
- package/plugins/triggers/log.mjs +104 -0
- package/plugins/triggers/management.mjs +181 -0
- package/plugins/triggers/options.mjs +117 -0
- package/plugins/triggers/overlay.mjs +7 -0
- package/plugins/triggers/poll.mjs +65 -0
- package/plugins/triggers/run.mjs +157 -0
- package/plugins/triggers/schedule.mjs +40 -0
- package/plugins/triggers/scheduler-service.mjs +46 -0
- package/plugins/triggers/scheduler.mjs +92 -0
- package/plugins/triggers/session-run.mjs +125 -0
- package/plugins/triggers/session.mjs +48 -0
- package/plugins/triggers/source-emit.mjs +19 -0
- package/plugins/triggers/source-host.mjs +78 -0
- package/plugins/triggers/source-ingress.mjs +70 -0
- package/plugins/triggers/source-sandbox.mjs +35 -0
- package/plugins/triggers/sources.mjs +45 -0
- package/plugins/triggers/spool.mjs +145 -0
- package/plugins/triggers/tools.mjs +67 -0
- package/plugins/triggers/unattended.mjs +18 -0
- package/plugins/tui-tools/composition.mjs +28 -0
- package/plugins/tui-tools/desktop-host.mjs +2 -0
- package/plugins/tui-tools/doctor-cli.mjs +22 -0
- package/plugins/tui-tools/doctor.mjs +149 -0
- package/plugins/tui-tools/hook-sources.mjs +113 -0
- package/plugins/tui-tools/hooks.mjs +23 -0
- package/plugins/tui-tools/index.mjs +269 -0
- package/plugins/tui-tools/sandbox-runner.mjs +123 -0
- package/plugins/tui-tools/shell.mjs +27 -0
- package/plugins/tui-tools/update.mjs +111 -0
- package/plugins/tui-tools/workspace-discovery.mjs +129 -0
- package/plugins/ultra/policy.mjs +42 -0
- package/plugins/worktree-subagent/worktree.mjs +56 -0
- package/runtime-sources.json +94 -0
- package/vendor/bash/LICENSE +21 -0
- package/vendor/bash/index.js +717 -0
- package/vendor/bash/types/background.d.ts +50 -0
- package/vendor/bash/types/index.d.ts +38 -0
- package/vendor/bash/types/render.d.ts +57 -0
- package/vendor/command-goal/LICENSE +21 -0
- package/vendor/command-goal/index.js +210 -0
- package/vendor/command-goal/types/index.d.ts +10 -0
- package/vendor/computer-use/LICENSE +21 -0
- package/vendor/computer-use/lib/approval-policy.js +12 -0
- package/vendor/computer-use/lib/approval-policy.js.map +1 -0
- package/vendor/computer-use/lib/artifacts.js +79 -0
- package/vendor/computer-use/lib/artifacts.js.map +1 -0
- package/vendor/computer-use/lib/backend.js +3 -0
- package/vendor/computer-use/lib/backend.js.map +1 -0
- package/vendor/computer-use/lib/client.js +369 -0
- package/vendor/computer-use/lib/client.js.map +1 -0
- package/vendor/computer-use/lib/config.js +159 -0
- package/vendor/computer-use/lib/config.js.map +1 -0
- package/vendor/computer-use/lib/confirmations.js +99 -0
- package/vendor/computer-use/lib/confirmations.js.map +1 -0
- package/vendor/computer-use/lib/diff.js +58 -0
- package/vendor/computer-use/lib/diff.js.map +1 -0
- package/vendor/computer-use/lib/errors.js +22 -0
- package/vendor/computer-use/lib/errors.js.map +1 -0
- package/vendor/computer-use/lib/exposure.js +244 -0
- package/vendor/computer-use/lib/exposure.js.map +1 -0
- package/vendor/computer-use/lib/index.js +66 -0
- package/vendor/computer-use/lib/index.js.map +1 -0
- package/vendor/computer-use/lib/leases.js +262 -0
- package/vendor/computer-use/lib/leases.js.map +1 -0
- package/vendor/computer-use/lib/providers/macos.js +243 -0
- package/vendor/computer-use/lib/providers/macos.js.map +1 -0
- package/vendor/computer-use/lib/providers/native-helper.js +726 -0
- package/vendor/computer-use/lib/providers/native-helper.js.map +1 -0
- package/vendor/computer-use/lib/providers/unsupported.js +51 -0
- package/vendor/computer-use/lib/providers/unsupported.js.map +1 -0
- package/vendor/computer-use/lib/service.js +608 -0
- package/vendor/computer-use/lib/service.js.map +1 -0
- package/vendor/computer-use/lib/skill.js +136 -0
- package/vendor/computer-use/lib/skill.js.map +1 -0
- package/vendor/computer-use/lib/target-resolver.js +180 -0
- package/vendor/computer-use/lib/target-resolver.js.map +1 -0
- package/vendor/computer-use/lib/tools.js +511 -0
- package/vendor/computer-use/lib/tools.js.map +1 -0
- package/vendor/computer-use/lib/types/approval-policy.d.ts +13 -0
- package/vendor/computer-use/lib/types/approval-policy.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/artifacts.d.ts +10 -0
- package/vendor/computer-use/lib/types/artifacts.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/backend.d.ts +124 -0
- package/vendor/computer-use/lib/types/backend.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/client/index.d.ts +83 -0
- package/vendor/computer-use/lib/types/client/index.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/config.d.ts +94 -0
- package/vendor/computer-use/lib/types/config.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/confirmations.d.ts +23 -0
- package/vendor/computer-use/lib/types/confirmations.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/diff.d.ts +5 -0
- package/vendor/computer-use/lib/types/diff.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/errors.d.ts +15 -0
- package/vendor/computer-use/lib/types/errors.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/exposure.d.ts +30 -0
- package/vendor/computer-use/lib/types/exposure.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/index.d.ts +21 -0
- package/vendor/computer-use/lib/types/index.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/leases.d.ts +81 -0
- package/vendor/computer-use/lib/types/leases.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/providers/macos.d.ts +39 -0
- package/vendor/computer-use/lib/types/providers/macos.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/providers/native-helper.d.ts +48 -0
- package/vendor/computer-use/lib/types/providers/native-helper.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/providers/unsupported.d.ts +23 -0
- package/vendor/computer-use/lib/types/providers/unsupported.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/service.d.ts +58 -0
- package/vendor/computer-use/lib/types/service.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/skill.d.ts +14 -0
- package/vendor/computer-use/lib/types/skill.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/target-resolver.d.ts +38 -0
- package/vendor/computer-use/lib/types/target-resolver.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/tools.d.ts +6 -0
- package/vendor/computer-use/lib/types/tools.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/types.d.ts +270 -0
- package/vendor/computer-use/lib/types/types.d.ts.map +1 -0
- package/vendor/computer-use/lib/types/web.d.ts +33 -0
- package/vendor/computer-use/lib/types/web.d.ts.map +1 -0
- package/vendor/computer-use/lib/types.js +9 -0
- package/vendor/computer-use/lib/types.js.map +1 -0
- package/vendor/computer-use/lib/web.js +188 -0
- package/vendor/computer-use/lib/web.js.map +1 -0
- package/vendor/computer-use/native/macos/Sources/Fixture/main.swift +412 -0
- package/vendor/computer-use/native/macos/Sources/Helper/CursorImage.swift +11 -0
- package/vendor/computer-use/native/macos/Sources/Helper/CursorMotion.swift +67 -0
- package/vendor/computer-use/native/macos/Sources/Helper/CursorOverlay.swift +840 -0
- package/vendor/computer-use/native/macos/Sources/Helper/TargetedPointer.swift +327 -0
- package/vendor/computer-use/native/macos/Sources/Helper/WindowNumberMatcher.swift +29 -0
- package/vendor/computer-use/native/macos/Sources/Helper/main.swift +1244 -0
- package/vendor/computer-use/native/macos/Sources/Monitor/main.swift +153 -0
- package/vendor/computer-use/native/macos/bin/dsh-computer-use-helper +0 -0
- package/vendor/computer-use/native/macos/manifest.json +14 -0
- package/vendor/persistent/LICENSE +21 -0
- package/vendor/persistent/index.js +411 -0
- package/vendor/persistent/types/index.d.ts +24 -0
- package/vendor/subagent/LICENSE +21 -0
- package/vendor/subagent/index.js +694 -0
- package/vendor/subagent/invariant.js +52 -0
- package/vendor/subagent/model-selection-settings.js +68 -0
- package/vendor/subagent/types/index.d.ts +82 -0
- package/vendor/subagent/types/invariant.d.ts +16 -0
- package/vendor/subagent/types/list-models.d.ts +10 -0
- package/vendor/subagent/types/model-selection-settings.d.ts +45 -0
- package/vendor/subagent/types/model-selection-state.d.ts +48 -0
- package/vendor/subagent/types/model-selection.d.ts +81 -0
- package/vendor/subagent-core/LICENSE +21 -0
- package/vendor/subagent-core/index.js +3202 -0
- package/vendor/subagent-core/invariant.js +76 -0
- package/vendor/subagent-core/typert.host.d.ts +3 -0
- package/vendor/subagent-core/typert.host.js +978 -0
- package/vendor/subagent-core/typert.remote-client.d.ts +25 -0
- package/vendor/subagent-core/typert.remote-client.js +114 -0
- package/vendor/subagent-core/types/archive-admission.d.ts +16 -0
- package/vendor/subagent-core/types/archive-admission.js +151 -0
- package/vendor/subagent-core/types/assistant-output.d.ts +48 -0
- package/vendor/subagent-core/types/assistant-output.js +73 -0
- package/vendor/subagent-core/types/catalog.d.ts +84 -0
- package/vendor/subagent-core/types/catalog.js +109 -0
- package/vendor/subagent-core/types/child-agent.d.ts +156 -0
- package/vendor/subagent-core/types/child-agent.js +213 -0
- package/vendor/subagent-core/types/client.d.ts +8 -0
- package/vendor/subagent-core/types/client.js +7 -0
- package/vendor/subagent-core/types/continuation-activation.d.ts +267 -0
- package/vendor/subagent-core/types/continuation-activation.js +700 -0
- package/vendor/subagent-core/types/continuation-messages.d.ts +62 -0
- package/vendor/subagent-core/types/continuation-messages.js +106 -0
- package/vendor/subagent-core/types/continuation.d.ts +124 -0
- package/vendor/subagent-core/types/continuation.js +455 -0
- package/vendor/subagent-core/types/control-types.d.ts +135 -0
- package/vendor/subagent-core/types/control-types.js +8 -0
- package/vendor/subagent-core/types/control.d.ts +45 -0
- package/vendor/subagent-core/types/control.js +79 -0
- package/vendor/subagent-core/types/depth.d.ts +31 -0
- package/vendor/subagent-core/types/depth.js +39 -0
- package/vendor/subagent-core/types/descriptor.d.ts +144 -0
- package/vendor/subagent-core/types/descriptor.js +193 -0
- package/vendor/subagent-core/types/error.d.ts +11 -0
- package/vendor/subagent-core/types/error.js +14 -0
- package/vendor/subagent-core/types/inbox.d.ts +43 -0
- package/vendor/subagent-core/types/inbox.js +61 -0
- package/vendor/subagent-core/types/index.d.ts +320 -0
- package/vendor/subagent-core/types/index.js +475 -0
- package/vendor/subagent-core/types/internal.d.ts +58 -0
- package/vendor/subagent-core/types/internal.js +58 -0
- package/vendor/subagent-core/types/invariant.d.ts +13 -0
- package/vendor/subagent-core/types/invariant.js +91 -0
- package/vendor/subagent-core/types/lifecycle.d.ts +113 -0
- package/vendor/subagent-core/types/lifecycle.js +180 -0
- package/vendor/subagent-core/types/list-children.d.ts +36 -0
- package/vendor/subagent-core/types/list-children.js +166 -0
- package/vendor/subagent-core/types/out-of-process.d.ts +118 -0
- package/vendor/subagent-core/types/out-of-process.js +219 -0
- package/vendor/subagent-core/types/projection-types.d.ts +82 -0
- package/vendor/subagent-core/types/projection-types.js +7 -0
- package/vendor/subagent-core/types/projection.d.ts +100 -0
- package/vendor/subagent-core/types/projection.js +157 -0
- package/vendor/subagent-core/types/run-settlement.d.ts +17 -0
- package/vendor/subagent-core/types/run-settlement.js +70 -0
- package/vendor/subagent-core/types/types.d.ts +377 -0
- package/vendor/subagent-core/types/types.js +19 -0
- package/vendor/subagent-driver/LICENSE +21 -0
- package/vendor/subagent-driver/index.js +255 -0
- package/vendor/subagent-driver/types/index.d.ts +33 -0
- package/vendor/subagent-driver/types/structured.d.ts +42 -0
- package/vendor/subagent-fork/LICENSE +21 -0
- package/vendor/subagent-fork/index.js +61 -0
- package/vendor/subagent-fork/types/index.d.ts +20 -0
- package/vendor/subagent-spawn/LICENSE +21 -0
- package/vendor/subagent-spawn/index.js +45 -0
- package/vendor/subagent-spawn/types/index.d.ts +19 -0
- package/vendor/terminal/LICENSE +21 -0
- package/vendor/terminal/index.js +1093 -0
- package/vendor/terminal/types/config.d.ts +82 -0
- package/vendor/terminal/types/index.d.ts +36 -0
- package/vendor/terminal/types/sanitize.d.ts +47 -0
- package/vendor/terminal/types/session.d.ts +87 -0
|
@@ -0,0 +1,784 @@
|
|
|
1
|
+
# Browser use
|
|
2
|
+
|
|
3
|
+
DSCODE can operate websites and verify local web apps through its bundled Chrome
|
|
4
|
+
DevTools MCP. Chrome starts only when you use `/browser start` or the agent calls
|
|
5
|
+
`browser_start`. No MCP configuration or separate npm installation is needed.
|
|
6
|
+
Google Chrome is required for browser tasks; ordinary coding does not need it.
|
|
7
|
+
|
|
8
|
+
## Start a task
|
|
9
|
+
|
|
10
|
+
From this checkout, run `npm start`, then ask:
|
|
11
|
+
|
|
12
|
+
> Use the browser to open http://localhost:3000, reproduce the form validation
|
|
13
|
+
> problem, fix it, and verify the result at desktop and mobile widths.
|
|
14
|
+
|
|
15
|
+
The agent loads the `browser-use` skill and discovers page, input, screenshot,
|
|
16
|
+
CSS, Console, network and performance tools. Page operations use explicit page IDs.
|
|
17
|
+
Allow the task's site when prompted, for example `/browser site once
|
|
18
|
+
http://localhost:3000` after starting the browser. Ordinary tool approvals do
|
|
19
|
+
not grant site access. CSS inspection, Console, network, performance and JavaScript tools also
|
|
20
|
+
require the Developer permissions described below.
|
|
21
|
+
Only the agent that started a connection receives its tools. The bundled MCP
|
|
22
|
+
version is used directly, without downloading an unpinned server through `npx`.
|
|
23
|
+
|
|
24
|
+
For links that open another tab asynchronously, the agent can use `browser_tabs`
|
|
25
|
+
with `action: wait`, `urlContains`, and `excludePageIds` recorded before clicking.
|
|
26
|
+
This returns one matching live page ID without repeating the click. The wait is
|
|
27
|
+
bounded to 10 seconds by default, configurable up to 30 seconds with `timeoutMs`.
|
|
28
|
+
Ambiguous matches require selecting a page; a timeout requires inspecting the
|
|
29
|
+
original action before retrying. Waiting does not claim ownership of a popup.
|
|
30
|
+
|
|
31
|
+
`/browser start` opens the configured Chrome connection manually. `/browser status`
|
|
32
|
+
shows a readable summary of configuration, connection health, profile location,
|
|
33
|
+
and last observed tabs, with ownership, retention reasons and observation time.
|
|
34
|
+
Append `--json` to a browser command for structured output, for example
|
|
35
|
+
`/browser tabs --json`.
|
|
36
|
+
`/browser tabs` refreshes the live tab list. A failed refresh returns an error;
|
|
37
|
+
neither this command nor `browser_tabs` with `action: status` presents cached
|
|
38
|
+
tabs as a successful refresh. `/browser status` remains available for inspecting
|
|
39
|
+
the last observed state. `/browser stop` disconnects and removes
|
|
40
|
+
this agent's tools. It closes a managed browser, but leaves an attached Chrome
|
|
41
|
+
running. A new start gets fresh page IDs; interrupted actions are never replayed.
|
|
42
|
+
|
|
43
|
+
## Profiles and login
|
|
44
|
+
|
|
45
|
+
| Command | Behavior |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| `/browser use persistent` | Default: dedicated profile per DSCODE session; login data survives restarting or resuming that session. |
|
|
48
|
+
| `/browser use persistent work` | Reuse the named `work` profile across sessions. Use it in one active browser at a time. |
|
|
49
|
+
| `/browser use isolated` | Temporary profile; its login data is discarded when the browser closes. |
|
|
50
|
+
| `/browser use connect http://127.0.0.1:9222` | Attach to a Chrome you have already launched with remote debugging. Only loopback HTTP endpoints are accepted. |
|
|
51
|
+
| `/browser use auto` | Attach through Chrome 144+ auto-connect. Enable remote debugging in `chrome://inspect/#remote-debugging` and approve Chrome's connection prompt. |
|
|
52
|
+
| `/browser use extension` | Experimental: share selected existing Chrome tabs through the DSCODE extension, without enabling a browser-wide remote-debugging port. |
|
|
53
|
+
|
|
54
|
+
Stop all session browsers before changing defaults. These settings persist in
|
|
55
|
+
`browser/config.json` under the native Harness home: a nonblank `DSH_HOME`,
|
|
56
|
+
otherwise `~/.dsh`. The terminal launcher maps `DSCODE_HOME` into `DSH_HOME`.
|
|
57
|
+
They apply to future starts. The agent cannot change browser mode
|
|
58
|
+
through a tool. Dedicated profiles are separate from personal Chrome profiles;
|
|
59
|
+
log in directly in the visible window when needed. The agent should keep that
|
|
60
|
+
tab and hand control to you for login or 2FA, then inspect the same page again.
|
|
61
|
+
|
|
62
|
+
Headless persistent and isolated browsers start with a 1280 × 800 viewport, so
|
|
63
|
+
preview content is not squeezed into a tall default screenshot. `resize_page`
|
|
64
|
+
can change that size during the session; in headless mode it activates the target
|
|
65
|
+
tab before resizing so Chrome updates its layout. A new browser start restores
|
|
66
|
+
the initial size. Visible and attached browsers keep their own window geometry.
|
|
67
|
+
|
|
68
|
+
To select a custom Chrome binary, stop the session browsers and set
|
|
69
|
+
`executablePath` in `browser/config.json` to an absolute path for your operating
|
|
70
|
+
system. This setting is available in `persistent` and `isolated` modes. Spaces
|
|
71
|
+
are preserved as part of the path. In JSON, Windows backslashes must be escaped,
|
|
72
|
+
for example `"executablePath": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"`.
|
|
73
|
+
Relative paths, including drive-relative Windows paths such as `C:chrome.exe`,
|
|
74
|
+
are rejected. The `connect`, `auto` and `extension` modes use an existing browser
|
|
75
|
+
and do not accept `executablePath`.
|
|
76
|
+
Switching between `persistent` and `isolated`, or selecting another named
|
|
77
|
+
persistent profile, preserves the custom executable and headless setting.
|
|
78
|
+
Switching to `connect`, `auto` or `extension` clears those launch settings;
|
|
79
|
+
returning to a managed browser uses visible Chrome with automatic binary
|
|
80
|
+
detection until you configure them again. The WebMCP preference is preserved
|
|
81
|
+
across mode changes.
|
|
82
|
+
|
|
83
|
+
Profile data is local account data. Stop browsers before moving or deleting it.
|
|
84
|
+
Do not point multiple Chrome processes at the same named profile. Chrome reports
|
|
85
|
+
profile contention rather than silently sharing that profile. Open-tab restoration
|
|
86
|
+
across a full stop is not guaranteed; persistence here refers to login/site data.
|
|
87
|
+
|
|
88
|
+
## Share tabs through the extension
|
|
89
|
+
|
|
90
|
+
The unpacked MV3 extension requires Chrome 125 or later. It is included in the
|
|
91
|
+
source tree and built bundles under `extensions/browser`; it has not been
|
|
92
|
+
published to the Chrome Web Store.
|
|
93
|
+
|
|
94
|
+
1. Stop session browsers, then run `/browser use extension` and `/browser pair`.
|
|
95
|
+
Pairing prints the installed extension folder and a private local link.
|
|
96
|
+
2. In `chrome://extensions`, enable Chrome's Developer mode, choose **Load
|
|
97
|
+
unpacked**, and select that folder. This Chrome setting is separate from
|
|
98
|
+
DSCODE's Developer permissions for page tools.
|
|
99
|
+
3. Open the tab to share, click **DSCODE Browser** in Chrome's extension toolbar,
|
|
100
|
+
paste the link and choose **Connect and share this tab**. The link expires
|
|
101
|
+
after five minutes if no browser-tool connection is established.
|
|
102
|
+
4. Run `/browser start`. Site permissions and action approvals still apply;
|
|
103
|
+
sharing a tab does not grant its origin in DSCODE. Use the permission command
|
|
104
|
+
reported by a denied tool, such as `/browser site once https://example.com`.
|
|
105
|
+
|
|
106
|
+
The agent sees shared tabs and tabs it creates through the connection. Other
|
|
107
|
+
existing tabs and unrelated popups are excluded. To add another tab, open the
|
|
108
|
+
extension on that tab and choose **Share this tab too**. **Stop all sharing**,
|
|
109
|
+
Chrome's debugging-cancellation control, or `/browser stop` ends the connection
|
|
110
|
+
and detaches the debugger. Existing Chrome and its tabs remain open. Starting
|
|
111
|
+
again requires a fresh user pairing; uncertain operations are never replayed.
|
|
112
|
+
The extension retains no pairing link across restarts.
|
|
113
|
+
**Stop all sharing** stays available during pairing or while another tab is
|
|
114
|
+
being shared. Stopping cancels a pending tab lookup and prevents an older
|
|
115
|
+
request's response from restoring the popup's sharing state. A debugger
|
|
116
|
+
attachment already in progress is detached when it settles.
|
|
117
|
+
Reopening the popup during pairing restores its pending status and stop control;
|
|
118
|
+
the popup refreshes until pairing settles. Stopping a pending connection cancels
|
|
119
|
+
its WebSocket wait immediately, so reconnecting does not have to wait for the
|
|
120
|
+
old connection timeout. A Chrome debugger attachment already in progress must
|
|
121
|
+
still settle before another pairing can start.
|
|
122
|
+
While sharing, an open popup refreshes its status about once per second without
|
|
123
|
+
disabling the sharing controls. It updates renamed or closed shared tabs and
|
|
124
|
+
returns to the pairing controls when DSCODE disconnects. A refresh response
|
|
125
|
+
cannot overwrite a newer share or stop action.
|
|
126
|
+
Its toolbar badge shows **ON** while sharing. A previous connection finishing
|
|
127
|
+
its shutdown does not clear the badge of a newly paired connection.
|
|
128
|
+
The Host may save the pairing command's output in local session history; the
|
|
129
|
+
link remains private until consumed, revoked or expired. `/browser status`
|
|
130
|
+
reports whether the extension has paired without repeating the link.
|
|
131
|
+
|
|
132
|
+
This transport supports ordinary page DOM, input and screenshot operations.
|
|
133
|
+
Browser-wide CDP operations, cookie administration and browser-context creation
|
|
134
|
+
are rejected. Tools requiring those operations, including some window-resizing,
|
|
135
|
+
download or recording paths, can report unsupported-command errors. Do not switch
|
|
136
|
+
transports to bypass a refusal. Real-extension verification covers main-frame
|
|
137
|
+
actions and cross-site iframe snapshots, form input and navigation, including
|
|
138
|
+
moving an iframe into the main page's process and back to a separate process.
|
|
139
|
+
Dedicated workers and their nested workers also passed execution, termination
|
|
140
|
+
and restart checks, with their messages returning to the shared page. Their
|
|
141
|
+
console logs were available with Developer permission; logs from a same-origin
|
|
142
|
+
unshared tab remained excluded. SharedWorker and Service Worker replies delivered
|
|
143
|
+
to the shared page passed loopback checks, while replies to an unshared page and
|
|
144
|
+
background-worker console messages remained excluded. Direct attachment,
|
|
145
|
+
activation and closure of these background targets are outside shared-tab scope.
|
|
146
|
+
Revoking sharing removes agent routes without stopping the page's own workers.
|
|
147
|
+
Direct background-worker debugging remains unsupported. These frame checks use the existing
|
|
148
|
+
top-level page permission boundary described below; they do not establish
|
|
149
|
+
independent grants for embedded origins.
|
|
150
|
+
See the [verification record](https://github.com/qiz029/dscode/blob/main/docs/verification.md) for the tested browser and limits.
|
|
151
|
+
|
|
152
|
+
## Take over and return control
|
|
153
|
+
|
|
154
|
+
Browser operations run in order within a session. Cancelling a request while it
|
|
155
|
+
is still queued returns immediately and prevents it from reaching Chrome; it
|
|
156
|
+
does not interrupt an earlier running request or let later requests overtake it.
|
|
157
|
+
This also applies to tab waits, handoff, resume and cleanup. Once an operation
|
|
158
|
+
has reached Chrome, cancellation cannot undo its effects: inspect the current
|
|
159
|
+
page before requesting a new action, and do not replay an uncertain write.
|
|
160
|
+
|
|
161
|
+
When the agent needs login, 2FA or another human step, it calls `browser_handoff`
|
|
162
|
+
with the tab ID and the step you need to complete. Chrome focuses the tab, DSCODE
|
|
163
|
+
retains it, and browser automation pauses. You can also take over with
|
|
164
|
+
`/browser handoff <id>`; get the ID from `/browser tabs`.
|
|
165
|
+
|
|
166
|
+
Complete the step in Chrome, run `/browser resume`, then ask the agent to continue.
|
|
167
|
+
Resume refreshes the live tab list; the agent must inspect the page again because
|
|
168
|
+
your edits can invalidate earlier element IDs. If the original tab closed or
|
|
169
|
+
Chrome restarted, resume reports that a fresh target is needed.
|
|
170
|
+
|
|
171
|
+
During handoff, DSCODE blocks page tools (including screenshots and snapshots),
|
|
172
|
+
agent-initiated stops and tab cleanup. Status and tab-list reads still work.
|
|
173
|
+
Handoff applies to this agent's browser connection; unrelated browser clients
|
|
174
|
+
are not locked. Your explicit `/browser stop` can still end the connection.
|
|
175
|
+
Exiting DSCODE also disposes its managed Chrome, including handed-off tabs.
|
|
176
|
+
Handoff needs a visible browser for manual interaction; a headless configuration
|
|
177
|
+
can pause automation but has no window to show you.
|
|
178
|
+
|
|
179
|
+
`/browser resume` returns browser control without starting an agent turn or
|
|
180
|
+
granting authorization for any new external action.
|
|
181
|
+
|
|
182
|
+
## Tab lifetime
|
|
183
|
+
|
|
184
|
+
Tabs the agent creates are temporary. At turn end DSCODE closes only its own
|
|
185
|
+
unmarked tabs. Existing tabs and tabs opened by the user are preserved. The agent
|
|
186
|
+
uses `browser_tabs` with `action: keep` and `pageId` to retain a deliverable.
|
|
187
|
+
You can do the same with `/browser keep <id>`. This only preserves the tab;
|
|
188
|
+
`browser_handoff` also pauses automation for manual work.
|
|
189
|
+
|
|
190
|
+
`/browser cleanup` closes unmarked owned tabs. Retention lasts until the tab closes
|
|
191
|
+
or the connection ends. A keep request or completed preview received while
|
|
192
|
+
cleanup is reading page or permission state is honored before that tab's close
|
|
193
|
+
is dispatched. It cannot cancel a close already sent to Chrome.
|
|
194
|
+
Chrome refuses to close its final tab, so cleanup may
|
|
195
|
+
leave that last page open. After a reconnect, previous ownership is discarded;
|
|
196
|
+
DSCODE never reuses old page IDs to close newly numbered tabs.
|
|
197
|
+
An owned tab is also retained when a page operation fails or is denied, so turn
|
|
198
|
+
cleanup cannot repeat a refused close or erase evidence of an uncertain action.
|
|
199
|
+
This includes a tab Chrome confirmed creating before its follow-up page check
|
|
200
|
+
failed. Inspect the tab list before retrying; creating another tab may duplicate
|
|
201
|
+
an operation that already succeeded. Ownership is never inferred from unrelated
|
|
202
|
+
new tabs, and a detected Chrome restart still discards old ownership.
|
|
203
|
+
An uncertain cleanup close is retained too: later turn cleanup will not retry it.
|
|
204
|
+
Inspect the remaining page and explicitly close it when appropriate. A Chrome
|
|
205
|
+
restart detected between cleanup operations stops the batch without reusing the
|
|
206
|
+
old tab IDs.
|
|
207
|
+
|
|
208
|
+
## Observation, files and permissions
|
|
209
|
+
|
|
210
|
+
### Site access and Developer mode
|
|
211
|
+
|
|
212
|
+
Unknown HTTP(S) sites require a user decision before page content can be read or
|
|
213
|
+
operated. `/browser permissions` lists decisions. An origin includes its scheme,
|
|
214
|
+
host and port: `http://localhost:3000`, `http://127.0.0.1:3000` and
|
|
215
|
+
`https://localhost:3000` are different grants. Wildcards and credential-bearing
|
|
216
|
+
URLs are not accepted. A blank tab is available without a site grant.
|
|
217
|
+
|
|
218
|
+
| Command | Effect |
|
|
219
|
+
| --- | --- |
|
|
220
|
+
| `/browser site once <origin>` | Allow this connection until it stops or the site is blocked/forgotten; start the browser first. |
|
|
221
|
+
| `/browser site allow <origin>` | Save an allow decision for future browser sessions. |
|
|
222
|
+
| `/browser site block <origin>` | Deny page access, including reads, and revoke that site's Developer and existing temporary grants. |
|
|
223
|
+
| `/browser site forget <origin>` | Remove the saved decision and invalidate existing temporary grants for this origin in all sessions. |
|
|
224
|
+
| `/browser developer on` / `off` | Enable or disable developer operations globally. Default: off. |
|
|
225
|
+
| `/browser developer allow <origin>` / `block <origin>` | Grant or revoke developer operations for one site, independently of ordinary site access. |
|
|
226
|
+
|
|
227
|
+
Developer operations include JavaScript evaluation, CSS rule inspection, console/network inspection,
|
|
228
|
+
performance/memory tooling and unrecognized future tools. Navigation with an
|
|
229
|
+
`initScript` also executes JavaScript and requires Developer grants on both the
|
|
230
|
+
current and requested destination origins; a scripted reload requires the current
|
|
231
|
+
origin's grant. Navigation without an injected script retains ordinary site checks.
|
|
232
|
+
For CSS debugging, `get_css_styles` takes an element UID from `take_snapshot`
|
|
233
|
+
and returns inline, matched and inherited rules with cascade information.
|
|
234
|
+
Results default to ten rules per page; use `pageIdx` and `pageSize` to inspect
|
|
235
|
+
additional rules. CSS inspection requires both global and per-site Developer grants.
|
|
236
|
+
DOM interaction,
|
|
237
|
+
screenshots, uploads, dialogs, viewport changes and WebMCP do not require Developer
|
|
238
|
+
mode, but retain site checks and their ordinary action approvals. An explicit site
|
|
239
|
+
block overrides temporary grants. Blocking or forgetting an origin records a
|
|
240
|
+
revocation in the same policy file. Other sessions drop their earlier temporary
|
|
241
|
+
grants on the next permission check or status refresh, even if they did not
|
|
242
|
+
observe the intervening block. Unrelated sites and Developer-only changes retain
|
|
243
|
+
their temporary grants. A new explicit temporary grant is available after the
|
|
244
|
+
block is removed. Stored rules live in `browser/permissions.json`
|
|
245
|
+
under the same home as browser settings, with owner-only permissions. Malformed
|
|
246
|
+
rules fail closed. Updated Desktop and terminal processes serialize permission
|
|
247
|
+
writes through `browser/permissions.guard.sqlite`, preserving simultaneous edits
|
|
248
|
+
to different sites. The guard releases if its process exits; a writer that waits
|
|
249
|
+
three seconds asks you to retry without changing the policy. Ordinary permission
|
|
250
|
+
reads continue during an edit. Keep the guard file in place, and update all
|
|
251
|
+
processes sharing this home: older builds do not participate in this lock and
|
|
252
|
+
reject the added revocation metadata. Stop and update those processes before changing site decisions.
|
|
253
|
+
The agent has no tool for granting itself access.
|
|
254
|
+
|
|
255
|
+
Permission queries and edits include the session's current cached browser state
|
|
256
|
+
in both readable receipts and `--json` output. Updating a grant does not stop a
|
|
257
|
+
connected browser or end a manual handoff. These receipts do not contact Chrome
|
|
258
|
+
to refresh tabs. If the connection closes while the policy is being read, the
|
|
259
|
+
receipt reports the disconnected state; an old handoff no longer shows a resume
|
|
260
|
+
instruction until a browser connection is available again.
|
|
261
|
+
|
|
262
|
+
DSCODE rechecks the live top-level page and grants at execution and before returning
|
|
263
|
+
the result. It reads permissions again immediately before dispatch, after any
|
|
264
|
+
WebMCP or file validation; a revocation visible to that final read prevents the
|
|
265
|
+
pending action from reaching Chrome. Returned page content is withheld after a redirect to an ungranted
|
|
266
|
+
origin, a site block, or revocation of Developer access during a developer operation.
|
|
267
|
+
This check covers the source URL, any target URL reported in the tool result,
|
|
268
|
+
and the final page URL: moving to another allowed site does not authorize content
|
|
269
|
+
already captured from a revoked source. An unavailable page also withholds the
|
|
270
|
+
result, except when the operation explicitly requested closing that page.
|
|
271
|
+
Any affected owned tab that remains open is retained for inspection; the action
|
|
272
|
+
is not replayed. A page change while approval is pending rejects the old invocation.
|
|
273
|
+
This is an agent-tool boundary: it cannot undo requests or
|
|
274
|
+
effects already delivered, block every page-initiated redirect or subresource,
|
|
275
|
+
or isolate cross-origin iframe content included by Chrome in a page snapshot.
|
|
276
|
+
It is not a browser network firewall. A website grant never authorizes purchases,
|
|
277
|
+
messages, uploads or other external actions beyond the user's request.
|
|
278
|
+
|
|
279
|
+
### WebMCP site tools
|
|
280
|
+
|
|
281
|
+
Stop session browsers, run `/browser webmcp on`, then start the browser. This
|
|
282
|
+
enables the pinned MCP's `list_webmcp_tools` and `execute_webmcp_tool` methods.
|
|
283
|
+
Managed Chrome receives `--enable-features=WebMCP`; attached Chrome must already
|
|
284
|
+
be Chrome 150+ with that feature enabled. Use `/browser webmcp off` while stopped
|
|
285
|
+
to disable it. Changing browser mode preserves this setting.
|
|
286
|
+
|
|
287
|
+
The agent first discovers definitions on a permitted page, then executes a named
|
|
288
|
+
tool with a JSON-object `input`. Automatic review receives the observed page URL
|
|
289
|
+
and discovered definition as untrusted evidence. A website's `readOnlyHint` never
|
|
290
|
+
bypasses action review. Discovery is bound to the browser's observed document
|
|
291
|
+
identity. Execution checks the current registration and observes the document
|
|
292
|
+
again before dispatch; changed definitions, same-URL reloads, embedded-document
|
|
293
|
+
changes, navigated pages and connection restarts require fresh discovery. If
|
|
294
|
+
document identity cannot be verified, discovery or execution is refused until
|
|
295
|
+
the page can be observed again. Rediscovering tools in a replacement document
|
|
296
|
+
does not transfer an earlier action review to that document.
|
|
297
|
+
A failed discovery or execution-time definition check also clears that page's
|
|
298
|
+
discovery record. Discover its tools again before retrying execution; records for
|
|
299
|
+
other pages remain available. An interrupted action must still be inspected before
|
|
300
|
+
retrying, because discovery does not determine whether that action completed.
|
|
301
|
+
If the execution request throws before its response is received, DSCODE reports
|
|
302
|
+
that the action may already have completed, clears that page's discovery and
|
|
303
|
+
retains an agent-owned tab for inspection. A new execution requires explicit
|
|
304
|
+
rediscovery; rediscovery never retries the interrupted action. Inspect the
|
|
305
|
+
site's resulting state before deciding whether another action is appropriate.
|
|
306
|
+
The same discovery invalidation applies when the action returns but its
|
|
307
|
+
post-action page check fails or its output is withheld after a permission
|
|
308
|
+
change. Restoring access alone does not authorize a replay.
|
|
309
|
+
Registration can still change after the check, so this does not attest to the
|
|
310
|
+
website's implementation or make its code trusted. Unsupported browsers and
|
|
311
|
+
sites without tools can use ordinary DOM operations instead.
|
|
312
|
+
|
|
313
|
+
### Images and files
|
|
314
|
+
|
|
315
|
+
DOM/accessibility snapshots support text-based interaction. Screenshots support
|
|
316
|
+
visual checks when the selected model accepts image inputs. DSCODE uses the
|
|
317
|
+
Harness attachment store for image results; a model without image support receives
|
|
318
|
+
an explicit image-unavailable diagnostic. It must not claim visual verification.
|
|
319
|
+
The [custom provider route](custom-providers.md#image-input) supports screenshots
|
|
320
|
+
and image attachments through Chat Completions, Responses and Anthropic Messages
|
|
321
|
+
when image input is explicitly enabled for the selected model. In the terminal
|
|
322
|
+
model editor choose **Input → Text and images**; in the experimental Desktop
|
|
323
|
+
package, enable **Accepts images** for that model under **Settings → DSCODE
|
|
324
|
+
models**, then save. New and existing configurations default to text-only input
|
|
325
|
+
unless explicitly enabled; the endpoint and model must actually support images.
|
|
326
|
+
Text-only models can still use DOM snapshots. Images already offloaded to text
|
|
327
|
+
placeholders remain omitted after a model change, so capture a new screenshot
|
|
328
|
+
after enabling image input when fresh visual evidence is needed.
|
|
329
|
+
|
|
330
|
+
File uploads and exports use absolute paths in the agent's workspace or its
|
|
331
|
+
browser artifact directory, reported by `browser_start`. Other paths and symlink
|
|
332
|
+
escapes are rejected, including sibling directories, similarly named directories
|
|
333
|
+
and files on other drives or network shares. Paths are checked both before queuing and immediately before
|
|
334
|
+
dispatch to Chrome, including attached browsers, so a symlink changed while the
|
|
335
|
+
operation waits is rechecked. This does not make filesystem access atomic: another
|
|
336
|
+
process can still change files between validation and Chrome's access.
|
|
337
|
+
This is a file-tool boundary, not a sandbox around JavaScript
|
|
338
|
+
running in a signed-in page. `evaluate_script` can modify pages and make requests.
|
|
339
|
+
|
|
340
|
+
Browser actions follow the current permission preset. The auto-review preset
|
|
341
|
+
reviews writes, navigation, JavaScript, screenshots and file operations; bounded
|
|
342
|
+
snapshot/list/diagnostic reads do not need a reviewer call. Browser actions have
|
|
343
|
+
an independent limit of 100 automatic reviews per turn, configurable through
|
|
344
|
+
`maxBrowserReviewsPerTurn` on `dscode-auto-review`. Other actions retain their
|
|
345
|
+
existing budget. Reaching either budget asks the human; it never grants access.
|
|
346
|
+
Repeated denials retain the same shared stop rule.
|
|
347
|
+
|
|
348
|
+
Web content cannot authorize actions. Sending messages, purchases, uploads,
|
|
349
|
+
account changes and destructive operations require user authorization for their
|
|
350
|
+
actual effects. A browser connection does not confer blanket authorization.
|
|
351
|
+
With a preset that disables approval, its existing full-access behavior applies.
|
|
352
|
+
|
|
353
|
+
## Troubleshooting and verification
|
|
354
|
+
|
|
355
|
+
- **Chrome missing:** install Chrome, then retry `/browser start`. A coding session
|
|
356
|
+
remains usable without it.
|
|
357
|
+
- **Connection ended:** inspect any uncertain side effect, stop and start the
|
|
358
|
+
browser, and list pages again. Do not replay a form submission blindly.
|
|
359
|
+
- **Page list unavailable or malformed:** refresh browser status before
|
|
360
|
+
continuing. Cached tabs cannot authorize an action or annotation when the
|
|
361
|
+
refresh lacks page metadata. If an action was already sent, inspect its result
|
|
362
|
+
before requesting another operation; a failed verification cannot undo it.
|
|
363
|
+
- **Click reports failure with an open dialog:** the click may have succeeded.
|
|
364
|
+
Inspect and handle the dialog before choosing another action.
|
|
365
|
+
- **Wrong account:** check `/browser status`; a session profile does not inherit
|
|
366
|
+
personal Chrome logins. Choose an appropriate mode explicitly.
|
|
367
|
+
- **Profile in use:** stop the other browser using that named profile, or choose a
|
|
368
|
+
different profile. Do not delete Chrome lock files to force concurrent use.
|
|
369
|
+
|
|
370
|
+
`npm run test:browser` exercises real headless Chrome on local fixtures and then
|
|
371
|
+
the native Harness tool/approval/image pipeline, including handoff and resume
|
|
372
|
+
across turns, without a paid model or external account. The real Chrome fixture
|
|
373
|
+
simulates a manual edit during the pause and verifies it after resume.
|
|
374
|
+
The WebMCP fixture exercises explicit site and Developer grants, two independently
|
|
375
|
+
counted server-side writes, same-URL reload and changed-definition refusal, direct-navigation denial,
|
|
376
|
+
and output withholding after a cross-origin redirect or in-flight revocation.
|
|
377
|
+
Developer and WebMCP calls wait on fixture responses while permission is revoked;
|
|
378
|
+
their results are withheld without replaying the operations. Additional cases hold
|
|
379
|
+
an actual Chrome read result, then navigate to another granted origin and revoke
|
|
380
|
+
the source grant, or close the page before delivery. It requires Chrome 150+.
|
|
381
|
+
Set `DSCODE_TEST_CHROME` to an absolute Chrome executable if necessary.
|
|
382
|
+
Normal unit tests do not require Chrome. `/doctor` does not perform this browser
|
|
383
|
+
exercise; a healthy general doctor report is not browser verification.
|
|
384
|
+
The Harness probe uses scripted model responses. It verifies the tool pipeline,
|
|
385
|
+
not a real model's success rate on long tasks. External account login, Chrome's
|
|
386
|
+
interactive auto-connect consent and comparisons against Codex are not automated
|
|
387
|
+
by this suite.
|
|
388
|
+
|
|
389
|
+
## Measure multi-step task performance
|
|
390
|
+
|
|
391
|
+
From a source checkout, run `npm run eval:browser -- --self-test` to verify the
|
|
392
|
+
evaluation pipeline without an API key. It drives the real DSCODE agent and Chrome
|
|
393
|
+
with fixed tool responses, marks the report as scripted, and records no model
|
|
394
|
+
quality score.
|
|
395
|
+
|
|
396
|
+
For a live DeepSeek evaluation, set `DEEPSEEK_API_KEY` locally and run:
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
npm run eval:browser -- --model deepseek-flash
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
To evaluate a saved custom service, use its `custom-…` ID from
|
|
403
|
+
`~/.dscode/providers.yaml` and an explicitly configured model:
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
npm run eval:browser -- --provider custom-YOUR-ID --model your-model-id
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
The evaluator snapshots that model's API format, context window, output budget,
|
|
410
|
+
thinking setting and image capability. It uses the same custom adapter as DSCODE,
|
|
411
|
+
including Chat Completions, Responses and Anthropic Messages. Credentials resolve
|
|
412
|
+
from the native shared credential store or its environment override. To use another
|
|
413
|
+
environment variable for this run, pass `--key-env VARIABLE_NAME`; never pass the
|
|
414
|
+
key value as an argument. Services configured with authentication `none` need no
|
|
415
|
+
key. `--providers-file /absolute/path/providers.yaml` selects another version-one
|
|
416
|
+
provider configuration without changing the saved services. `--thinking` is a
|
|
417
|
+
DeepSeek-only option; custom services use the saved model setting.
|
|
418
|
+
|
|
419
|
+
Invalid configuration or missing credentials stops before launching Chrome or
|
|
420
|
+
creating a report. Keys are passed to the isolated Host through its environment,
|
|
421
|
+
excluded from configuration snapshots, and redacted if echoed in recorded text.
|
|
422
|
+
Custom endpoint requests still incur whatever usage charges that service applies.
|
|
423
|
+
|
|
424
|
+
The three disposable local tasks cover a multi-page reservation form, reading a
|
|
425
|
+
random code in a second tab, and handling a dialog after a successful write.
|
|
426
|
+
They use a fresh headless Chrome profile. Each task must submit the right values
|
|
427
|
+
exactly once, read a random server-issued receipt, preserve the result tab and
|
|
428
|
+
finish within budget. An independent server-side check scores the result; an
|
|
429
|
+
agent's claim of success does not pass a task. The benchmark permits browser UI
|
|
430
|
+
tools on its loopback website; JavaScript evaluation, shell, files and external
|
|
431
|
+
websites are outside its tool surface. Fixture actions are preauthorized, so
|
|
432
|
+
approval counts measure dispatch rather than human approval latency.
|
|
433
|
+
|
|
434
|
+
Reports default to a new directory under `artifacts/local/`. `report.md` lists task
|
|
435
|
+
outcomes, elapsed time, model/tool calls, tool errors, handoffs and duplicate
|
|
436
|
+
submissions. `results.json` contains the independent checks and server state;
|
|
437
|
+
`traces.jsonl` contains browser tool activity. `manifest.json` records the model,
|
|
438
|
+
provider, endpoint, effective model settings, source hashes and budgets. Existing report directories are never overwritten.
|
|
439
|
+
Interrupted or incomplete runs retain partial evidence without a quality score;
|
|
440
|
+
provider/runtime errors also suppress the aggregate score.
|
|
441
|
+
|
|
442
|
+
Use `--cases reservation,reference,dialog`, `--max-calls 30`, `--max-tools 45`,
|
|
443
|
+
`--case-timeout-ms 240000` and `--call-timeout-ms 60000` to select tasks or bound a
|
|
444
|
+
run. Limits apply per task. Live evaluations incur normal model usage charges.
|
|
445
|
+
Handoffs are counted but need a person and are not completed automatically.
|
|
446
|
+
|
|
447
|
+
This small DOM task suite does not measure visual accuracy, production login,
|
|
448
|
+
real-site reliability or parity with Codex. Its scripted self-test cannot replace
|
|
449
|
+
live-model runs. No live-model score is implied by `npm run check` or CI passing.
|
|
450
|
+
|
|
451
|
+
The terminal uses a separate Chrome window, including user-shared tabs in
|
|
452
|
+
extension mode. It has no embedded preview pane or visual annotation UI. DOM actions, screenshots,
|
|
453
|
+
DevTools debugging, persistence and handoff use the browser tools described here.
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
## Experimental Desktop preview and annotations
|
|
457
|
+
|
|
458
|
+
The local browser bundle targets the official DeepSeek Harness Host and its
|
|
459
|
+
shared Web/Desktop sidebar. Build for the version displayed by your application:
|
|
460
|
+
`node scripts/build-browser-desktop.mjs 0.2.0-rc.2` for the official macOS download
|
|
461
|
+
verified on 2026-10-06, or `node scripts/build-browser-desktop.mjs 0.2.1-alpha.1`
|
|
462
|
+
for the newer source/npm runtime. Omitting the version selects 0.2.1-alpha.1.
|
|
463
|
+
The private, unpublished output is `artifacts/desktop/browser`; its core peers
|
|
464
|
+
match the selected target exactly. The two versions are distinct distribution
|
|
465
|
+
channels, so check the installed version before choosing a target.
|
|
466
|
+
|
|
467
|
+
The shared Web client on 0.2.1-alpha.1 and the official macOS Apple Silicon
|
|
468
|
+
Electron app on 0.2.0-rc.2 have been exercised with an isolated local fixture.
|
|
469
|
+
The macOS app was launched from its signed disk image. For this browser-only
|
|
470
|
+
bundle, persistent installation and upgrades remain unverified; the combined
|
|
471
|
+
package below has a separate native installation check. Windows and live-model
|
|
472
|
+
visual understanding remain unverified. This bundle
|
|
473
|
+
contains browser integration only. The complete DSCODE terminal preset still uses
|
|
474
|
+
its existing runtime.
|
|
475
|
+
|
|
476
|
+
In **Browser preview**, **Start browser** records readable connection and tab
|
|
477
|
+
status in the conversation. Explicit `/browser start --json` commands retain
|
|
478
|
+
their machine-readable output. You can also enter complete commands such as
|
|
479
|
+
`/browser handoff 2`, `/browser resume` or `/browser tabs --json` in the Desktop
|
|
480
|
+
composer. They run as user commands and record results without starting a model
|
|
481
|
+
turn. Invalid arguments produce a command error; these commands do not accept
|
|
482
|
+
attachments. **Stop browser** ends this session's browser
|
|
483
|
+
connection, clears the preview and keeps the unsent annotation. It remains
|
|
484
|
+
available during startup, capture, tab refresh and annotation requests; pending
|
|
485
|
+
permission changes finish first. Earlier responses cannot restore stopped
|
|
486
|
+
pixels or clear the draft. Start again and capture a fresh image before sending.
|
|
487
|
+
Stop uses the same browser ownership and persistent-profile rules as
|
|
488
|
+
`/browser stop`; it cannot recall an annotation already delivered to the agent.
|
|
489
|
+
|
|
490
|
+
An active handoff appears as **Waiting for you**, with the manual step and a
|
|
491
|
+
**Resume browser control** button. While visible, the pane checks the Host's
|
|
492
|
+
saved connection, handoff state and site permissions every 2.5 seconds when no other preview
|
|
493
|
+
operation is pending.
|
|
494
|
+
These checks do not contact Chrome, capture images or send model messages.
|
|
495
|
+
Hiding the pane stops them; **Refresh tabs** also reads the current state.
|
|
496
|
+
Stopping the browser elsewhere, including through `/browser stop`, clears the
|
|
497
|
+
old screenshot, selected point, tab selection and handoff notice on the next
|
|
498
|
+
idle check. The annotation draft stays available. Start or reconnect the browser
|
|
499
|
+
and capture a fresh preview before sending it.
|
|
500
|
+
If **Refresh tabs** observes disconnection first, it applies the same cleanup
|
|
501
|
+
and keeps the draft, even when the response includes historical tabs or a handoff.
|
|
502
|
+
|
|
503
|
+
During the pause, old pixels and the selected point are cleared, automatic refresh stops, and capture
|
|
504
|
+
and annotation sending are disabled. The annotation draft remains editable.
|
|
505
|
+
Complete the step in Chrome, then resume. Resuming records the user command in
|
|
506
|
+
the conversation and reloads tabs while preserving the draft, even if Chrome
|
|
507
|
+
restarted and a different tab is selected. Capture a fresh image and select a
|
|
508
|
+
point before sending. A failed resume leaves the handoff visible for retry.
|
|
509
|
+
Resuming only returns browser control; ask the agent to continue when ready.
|
|
510
|
+
|
|
511
|
+
Start the current session's browser, select a tab and
|
|
512
|
+
choose **Refresh preview**. The image comes from the Chrome page controlled by
|
|
513
|
+
the agent. Existing site permission is required. **Refresh while visible** polls
|
|
514
|
+
while the pane is visible and pauses when you select an annotation point. These
|
|
515
|
+
refreshes do not send messages to the model. A successful capture also updates
|
|
516
|
+
the selected tab address and reloads site permissions, so permission controls
|
|
517
|
+
follow the captured site after navigation. The fitted view leaves room for the
|
|
518
|
+
annotation controls; **Expand image** enlarges it for closer inspection.
|
|
519
|
+
|
|
520
|
+
PNG previews support up to 12 MiB of encoded image data. Large screenshots remain
|
|
521
|
+
available inline even when Chrome MCP also saves a temporary file; explicit
|
|
522
|
+
`take_screenshot` file exports stay file-only. If a preview exceeds the limit,
|
|
523
|
+
reduce the viewport and capture again. Model input may be resized or re-encoded
|
|
524
|
+
by the attachment pipeline to fit the selected provider's image budget.
|
|
525
|
+
|
|
526
|
+
The **Site permissions** summary shows the last loaded access decision. Expand
|
|
527
|
+
it to see the selected HTTP(S) origin and permission controls. These controls
|
|
528
|
+
start collapsed to leave more room for preview and annotation. **Allow this session** lasts until that browser stops;
|
|
529
|
+
**Always allow** saves access; **Block site** denies access and removes its
|
|
530
|
+
Developer grant. **Forget decision** clears both the saved decision and the
|
|
531
|
+
temporary grants for this origin in every session. To replace a saved allow or
|
|
532
|
+
block with temporary access, forget
|
|
533
|
+
the decision first. Selecting a tab does not grant access. Blank tabs have no
|
|
534
|
+
site controls.
|
|
535
|
+
|
|
536
|
+
Expand **Developer access** to enable or disable Developer mode globally and
|
|
537
|
+
grant or revoke it for the selected origin. Both the global mode and the site's
|
|
538
|
+
Developer grant are required, in addition to ordinary access. Editing a Developer
|
|
539
|
+
grant preserves temporary ordinary access. These controls use the same rules as
|
|
540
|
+
`/browser site` and `/browser developer`; tool-action approvals still apply.
|
|
541
|
+
The visible idle pane also reloads decisions changed elsewhere. A change to the
|
|
542
|
+
selected origin's access, temporary grant, Developer grant or global Developer
|
|
543
|
+
mode clears the old preview and selected point while keeping the draft. Changes
|
|
544
|
+
to other origins leave the current preview intact. **Refresh tabs** reloads
|
|
545
|
+
decisions immediately. Changing permissions through the sidebar clears
|
|
546
|
+
the preview and annotation point, stops automatic refresh and preserves typed
|
|
547
|
+
comment text. Permission controls remain available while a capture, tab refresh or
|
|
548
|
+
annotation request is pending. Responses from before a permission change cannot
|
|
549
|
+
restore the old image or access display, or clear the retained draft. Tabs
|
|
550
|
+
can be refreshed after the permission request settles even if the older request
|
|
551
|
+
has not returned; its late completion cannot unlock or overwrite a newer request.
|
|
552
|
+
An annotation already delivered to the agent cannot be recalled. Capture a fresh
|
|
553
|
+
image before sending. Permission controls were
|
|
554
|
+
exercised in both the shared Web client and the official macOS Electron 0.2.0-rc.2
|
|
555
|
+
window, including a narrow sidebar and a fresh image annotation after reauthorization.
|
|
556
|
+
These checks used disposable local fixtures and a scripted model.
|
|
557
|
+
|
|
558
|
+
Click the image, or use Tab to focus it and press Enter or Space to select its
|
|
559
|
+
center. Arrow keys move the point one screenshot pixel; hold Shift to move ten
|
|
560
|
+
pixels. Escape clears the point without clearing the draft. The selected pixel
|
|
561
|
+
coordinates appear below the image and are announced to assistive technology.
|
|
562
|
+
Keyboard selection follows the same expiry and pending-request restrictions as
|
|
563
|
+
mouse selection. Enter a comment and choose **Send annotation** to queue a user
|
|
564
|
+
message in the current session with the captured image, page URL, capture time
|
|
565
|
+
and pixel coordinates. You can keep editing while a send or tab refresh is
|
|
566
|
+
pending. Its completion clears only a draft that has not been edited since the
|
|
567
|
+
request started; newer text remains for a fresh screenshot and annotation point.
|
|
568
|
+
The image records past pixels; the agent must inspect the
|
|
569
|
+
live page before acting. Each capture can be sent once and expires 60 seconds
|
|
570
|
+
after the screenshot request starts. Time spent waiting for Chrome, transferring
|
|
571
|
+
the image and checking the page counts toward that limit; a capture that already
|
|
572
|
+
expired when it returns is refused. At expiry, the panel labels the image as expired, removes the selected
|
|
573
|
+
point and disables sending while retaining the typed draft. Choose **Refresh
|
|
574
|
+
preview** and select a fresh point to send it. Refresh after navigation or a
|
|
575
|
+
browser reconnection as well.
|
|
576
|
+
Handoff and revoked site permission prevent sending. A model that accepts only
|
|
577
|
+
text receives an image placeholder; the image remains stored in the conversation.
|
|
578
|
+
The send confirmation states when the model will receive text only, including
|
|
579
|
+
when model metadata is unavailable and image input cannot be confirmed.
|
|
580
|
+
Owned tabs used for preview are retained for inspection. Hiding the panel keeps
|
|
581
|
+
the current session's unsent text and selected tab in memory, but clears the
|
|
582
|
+
preview and point and stops automatic refresh. Reopening requires a fresh
|
|
583
|
+
capture and point before sending. Switching sessions or closing the pane clears
|
|
584
|
+
the draft; drafts do not survive an application reload. A send already dispatched
|
|
585
|
+
still belongs to its original session; its acknowledgement clears only text that
|
|
586
|
+
has not been edited, including after reopening the panel. Refreshing the tab
|
|
587
|
+
list clears the annotation point if its page closed or navigated. Navigation
|
|
588
|
+
within the same tab (including URL fragment changes), a same-URL reload or an
|
|
589
|
+
embedded-document change clears the old image and point while keeping the
|
|
590
|
+
comment draft. Refresh the preview and select a new point before sending it.
|
|
591
|
+
Choosing another tab or falling back to another tab after closure clears the
|
|
592
|
+
previous tab's draft. Text written before any tab is selected is kept when
|
|
593
|
+
starting the browser or refreshing an empty list selects the first tab. Capture
|
|
594
|
+
that tab and select a point before sending the retained text.
|
|
595
|
+
If a preview request fails, automatic refresh stops and the captured image and
|
|
596
|
+
selected point are cleared. The typed comment remains available for a fresh
|
|
597
|
+
capture. Revoking sharing while an annotation is awaiting image storage or model
|
|
598
|
+
metadata prevents that annotation from being queued. Before enqueueing, DSCODE
|
|
599
|
+
refreshes the observed tab list and rechecks the browser connection, page URL,
|
|
600
|
+
document identity, permissions, cancellation and the 60-second expiry. If the
|
|
601
|
+
tab closed, moved to another URL or reloaded during those waits, capture it
|
|
602
|
+
again before sending. The check includes iframe documents, including cross-site
|
|
603
|
+
and nested frames: reloading, adding or removing one invalidates the old preview.
|
|
604
|
+
Captures also require the same document set before and after the screenshot.
|
|
605
|
+
Document identity comes from Chrome's frame loaders, without page JavaScript or
|
|
606
|
+
Developer access. An unavailable or changing frame tree prevents capturing or
|
|
607
|
+
sending a preview. DOM-only updates within existing documents are not identified
|
|
608
|
+
by this check, and an external navigation can still occur after the last browser
|
|
609
|
+
observation. The annotation continues to describe past pixels.
|
|
610
|
+
|
|
611
|
+
This panel uses DSCODE's separate Chrome connection. The official sidebar's
|
|
612
|
+
independent browser webviews are not controlled by these tools. Extension
|
|
613
|
+
transport has been verified with native Desktop Host pairing, screenshot and
|
|
614
|
+
annotation endpoints. The combined rendered macOS panel and extension transport
|
|
615
|
+
also passed an isolated local fixture: point selection pauses refresh, sending
|
|
616
|
+
delivers one annotation with its image, and revoking sharing clears the preview,
|
|
617
|
+
stops refresh and preserves unsent comment text. This used the signed 0.2.0-rc.2
|
|
618
|
+
app, a disposable Chrome for Testing instance and a scripted model; ordinary
|
|
619
|
+
Chrome toolbar installation and live-model understanding remain unverified.
|
|
620
|
+
|
|
621
|
+
### Install the experimental combined Desktop package
|
|
622
|
+
|
|
623
|
+
The source checkout can also package the DSCODE agent preset, custom-model
|
|
624
|
+
and account settings, browser preview, durable session communication, cross-session
|
|
625
|
+
memory and opt-in task scheduling together. Ordinary builds remain private;
|
|
626
|
+
the separate [release process](hub-distribution.md#desktop-release-candidate-and-publication)
|
|
627
|
+
qualifies a public candidate for 0.2.0-rc.2. The Desktop preview is published on npm as
|
|
628
|
+
`@toddzheng024/dscode-desktop@0.7.34`. The package does
|
|
629
|
+
not yet include all DSCODE Host services. Its experimental
|
|
630
|
+
[native Computer Use adapter](computer-use.md) has passed helper and lifecycle
|
|
631
|
+
checks; window observation, screenshots and input await qualification with
|
|
632
|
+
macOS Accessibility permission.
|
|
633
|
+
Choose this package or the browser-only bundle; enabling both duplicates their
|
|
634
|
+
browser services.
|
|
635
|
+
|
|
636
|
+
The Desktop plugin's package name is `@toddzheng024/dscode-desktop`. It also
|
|
637
|
+
includes [Plugin Hub](plugin-hub.md) for community discovery and installation
|
|
638
|
+
through the official manager. The earlier private
|
|
639
|
+
`@toddzheng024/dscode-desktop-preset-probe` must be removed before installing
|
|
640
|
+
this package; both register the same DSCODE components. Back up your Desktop
|
|
641
|
+
state first. A separate macOS Desktop 0.2.0-rc.2 migration check preserved
|
|
642
|
+
sessions, credentials, configuration and user patches when removing the old
|
|
643
|
+
name and installing the formal package.
|
|
644
|
+
|
|
645
|
+
DSCODE sessions in the same Desktop state directory can discover session cards,
|
|
646
|
+
read other active DSCODE root sessions, send requests or notifications, and reply
|
|
647
|
+
through the production session bridge. `/session`, `/mailbox` and `/tasks` show
|
|
648
|
+
the endpoint, mailbox and communication history. Deferred notes wait for a
|
|
649
|
+
natural turn; reading or resuming a session does not wake them. See
|
|
650
|
+
[Session communication](session-communication.md) for delivery modes and budgets.
|
|
651
|
+
Cross-session memory uses the same extraction and evidence store as the terminal.
|
|
652
|
+
`/memories` controls reading, background generation and cleanup in DSCODE sessions;
|
|
653
|
+
native Standard sessions cannot modify this store and do not receive its prompt
|
|
654
|
+
or retrieval tool. See [Memory](memory.md#experimental-desktop-package) for state
|
|
655
|
+
directory, restart and removal behavior.
|
|
656
|
+
|
|
657
|
+
The terminal activity-line presentation is not included in this Desktop package.
|
|
658
|
+
The ordinary native Standard preset is excluded from DSCODE root discovery;
|
|
659
|
+
subagents inherit their parent's task budgets and are not independent targets.
|
|
660
|
+
|
|
661
|
+
Desktop and a normal DSCODE terminal installation usually use different state
|
|
662
|
+
directories. For external CLI access, copy the `--home` option printed by
|
|
663
|
+
Desktop's `/session`, for example `dscode sessions --home /path/to/desktop-home`.
|
|
664
|
+
This requires the DSCODE CLI separately; installing the Desktop package does not
|
|
665
|
+
install the terminal launcher. A shared model credential file does not make
|
|
666
|
+
sessions in different state directories discoverable to each other.
|
|
667
|
+
|
|
668
|
+
Build from a checkout whose dependencies have been installed. Use the exact
|
|
669
|
+
version shown in **About DeepSeek Harness**; currently accepted build targets
|
|
670
|
+
are `0.2.0-rc.2` and `0.2.1-alpha.1`. For the verified macOS application:
|
|
671
|
+
|
|
672
|
+
```bash
|
|
673
|
+
npm install --prefix .research/desktop-runtime --ignore-scripts --no-audit --no-fund --save-exact @deepseek-ai/dsh@0.2.0-rc.2
|
|
674
|
+
node scripts/pack-desktop-preset.mjs .research/desktop-runtime
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
The command prints an absolute `.tgz` path under `artifacts/desktop/packages`
|
|
678
|
+
and writes a neighboring JSON receipt with its SHA-256, package identity and
|
|
679
|
+
target runtime. The filename includes the runtime version and content hash.
|
|
680
|
+
It does not install or publish anything, and it leaves the terminal runtime
|
|
681
|
+
unchanged.
|
|
682
|
+
|
|
683
|
+
The first build downloads the lockfile-pinned file-lock library and its four
|
|
684
|
+
macOS/Linux ARM64/x64 prebuild archives. SHA-512 verification precedes extraction;
|
|
685
|
+
later builds reuse the verified cache under `artifacts/desktop/native-cache`.
|
|
686
|
+
These dependencies and their licenses ship inside the tarball, avoiding the
|
|
687
|
+
bundled pnpm 11.7 upgrade hang when it fetches foreign optional prebuilds after
|
|
688
|
+
reporting completion. No dependency installation scripts run during packaging.
|
|
689
|
+
Including a platform's binary does not establish Desktop qualification on that
|
|
690
|
+
platform; the tested application remains macOS Apple Silicon.
|
|
691
|
+
|
|
692
|
+
The package also ships DSCODE's `apply_patch` helper for standard unified diffs.
|
|
693
|
+
DSCODE's persistent shell, child shells and fresh `shell_retry` calls resolve this
|
|
694
|
+
helper before any same-named command on the inherited PATH. `apply_patch --check`
|
|
695
|
+
validates without writing. This setup leaves the Desktop Host's global PATH and
|
|
696
|
+
native Standard shell providers unchanged; shell sandbox and approval rules still
|
|
697
|
+
apply.
|
|
698
|
+
|
|
699
|
+
Once a version has been published, **Plugins → Add plugin** also accepts
|
|
700
|
+
`@toddzheng024/dscode-desktop@<version>`. Pin the version whose release notes
|
|
701
|
+
match your Harness runtime. The `preview` npm tag follows the current Desktop
|
|
702
|
+
preview. For archive installation, download the matching `.tgz` and `.sha256`
|
|
703
|
+
from [GitHub Releases](https://github.com/qiz029/dscode/releases) and verify it
|
|
704
|
+
with `shasum -a 256 -c <downloaded-file>.tgz.sha256` before installing. Dependency
|
|
705
|
+
resolution still needs network access.
|
|
706
|
+
|
|
707
|
+
To install through the official interface, open **Plugins → Add plugin**, enter
|
|
708
|
+
the absolute `.tgz` path, install it and choose **Enable now**.
|
|
709
|
+
|
|
710
|
+
For CLI installation, open the application once to initialize its Desktop
|
|
711
|
+
profile, then fully quit it. Use its bundled command, adjusting the application
|
|
712
|
+
path and replacing the package placeholder with the printed tarball path:
|
|
713
|
+
|
|
714
|
+
```bash
|
|
715
|
+
desktop_dsh='/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh'
|
|
716
|
+
desktop_package='/absolute/path/printed-by-pack-command.tgz'
|
|
717
|
+
"$desktop_dsh" plugin --profile desktop add "$desktop_package" --ignore-scripts
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
Reopen Desktop, choose **DSCODE** for a new session, and configure a model under
|
|
721
|
+
**Settings → DSCODE models**, or connect a supported account under
|
|
722
|
+
**Settings → DSCODE accounts**. Browser preview is available in the right sidebar.
|
|
723
|
+
**Settings → DSCODE schedules** manages tasks for an open DSCODE session and
|
|
724
|
+
explicitly enables or stops delivery. Its launch preference is saved; Desktop
|
|
725
|
+
must remain open to deliver tasks. See [Desktop scheduling](triggers.md#experimental-desktop-scheduling)
|
|
726
|
+
for restart, removal and permission behavior, and current qualification limits.
|
|
727
|
+
|
|
728
|
+
The account page saves or removes the shared OpenRouter API key. Changes also
|
|
729
|
+
affect terminal sessions and native routes reading that same credential file;
|
|
730
|
+
environment-owned keys remain read-only. The saved key is never returned to the
|
|
731
|
+
form. Choose **DSCODE OpenRouter** in the model picker for DSCODE reasoning
|
|
732
|
+
controls, including Ultra on supported models. The native OpenRouter route
|
|
733
|
+
remains available separately.
|
|
734
|
+
|
|
735
|
+
For Grok, run `grok login` in a terminal and refresh the account status. DSCODE
|
|
736
|
+
reads `~/.grok/auth.json` without changing or refreshing its tokens. For OpenCode
|
|
737
|
+
Go, use **Sign in to OpenCode Go**; the browser consent page identifies the
|
|
738
|
+
OpenCode CLI client used by the existing DSCODE login flow. The page shows
|
|
739
|
+
pending login status and supports cancellation and local sign-out. Choose
|
|
740
|
+
**DSCODE OpenCode Go** after signing in. Native OpenCode Go configuration remains
|
|
741
|
+
separate. DeepSeek account and API-key configuration use the native settings.
|
|
742
|
+
Account sign-out does not revoke the remote OpenCode token; see
|
|
743
|
+
[OpenCode Go](opencode-go.md) for login behavior and limits.
|
|
744
|
+
|
|
745
|
+
Background login polling preserves a failed action's error and any unsaved
|
|
746
|
+
OpenRouter key. A polling failure appears separately; recovery clears that
|
|
747
|
+
refresh error without hiding the action error. A successful key save clears
|
|
748
|
+
the key field. Polling leaves editing enabled; saving during an in-flight status
|
|
749
|
+
request waits for that request and then applies the save once.
|
|
750
|
+
|
|
751
|
+
These routes share DSCODE's production adapters and credential store. The
|
|
752
|
+
Desktop package retains the native default web-search provider; registering
|
|
753
|
+
DSCODE's routed search does not switch that default.
|
|
754
|
+
|
|
755
|
+
For an upgrade, fully quit Desktop and repeat the `add` command with the new
|
|
756
|
+
tarball. A running Host needs a restart to load replaced package code. A Desktop
|
|
757
|
+
runtime upgrade requires rebuilding the package for that exact runtime; the
|
|
758
|
+
native installer rejects incompatible peers.
|
|
759
|
+
|
|
760
|
+
To remove this experimental package, fully quit Desktop and run:
|
|
761
|
+
|
|
762
|
+
```bash
|
|
763
|
+
"$desktop_dsh" plugin --profile desktop remove @toddzheng024/dscode-desktop --config.ignore-scripts=true
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
On macOS Desktop `0.2.0-rc.2`, the combined package's native installation,
|
|
767
|
+
upgrade, rejection of an incompatible update, removal and reinstallation passed
|
|
768
|
+
an isolated lifecycle check with scheduling enabled. Its saved preference, task
|
|
769
|
+
definition and pending job survived; delivery resumed after upgrade and
|
|
770
|
+
reinstallation. Removing the package withdrew its scheduling and account RPCs.
|
|
771
|
+
The scheduling form's rendered interaction has separate qualification limits
|
|
772
|
+
linked above.
|
|
773
|
+
Model configuration, credentials, browser permissions, session files, deferred
|
|
774
|
+
mailbox messages and the user profile patch were preserved; an existing session
|
|
775
|
+
resumed after upgrade and after removal followed by reinstallation. Retrying the
|
|
776
|
+
same message key retained its identity. A deferred note stayed asleep through
|
|
777
|
+
these restarts and was delivered once on the next user turn.
|
|
778
|
+
The check also continued the same named child after upgrade and reinstallation.
|
|
779
|
+
Its worktree files survived, and its native shell ran in that original worktree.
|
|
780
|
+
A question waiting on the parent survived upgrade; replying resumed the child
|
|
781
|
+
and cleared its waiting indicator. Cold child names stayed reserved.
|
|
782
|
+
Removal withdraws the DSCODE preset and tools while retaining their data. Reinstall
|
|
783
|
+
a matching package to use that preset again. This check does not qualify Windows,
|
|
784
|
+
an in-place upgrade of the official application, or real-model visual quality.
|