@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.
Files changed (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -2
  3. package/THIRD_PARTY_NOTICES.md +30 -0
  4. package/bin/apply_patch +9 -0
  5. package/cordis.patch.yml +433 -0
  6. package/docs/CHANGELOG.md +649 -0
  7. package/docs/account-login.md +44 -0
  8. package/docs/auto-review.md +128 -0
  9. package/docs/browser-use.md +784 -0
  10. package/docs/computer-use.md +81 -0
  11. package/docs/custom-providers.md +88 -0
  12. package/docs/demo.md +158 -0
  13. package/docs/distribution.md +58 -0
  14. package/docs/dscode-ultra.md +75 -0
  15. package/docs/email.md +296 -0
  16. package/docs/exec.md +40 -0
  17. package/docs/hub-distribution.md +212 -0
  18. package/docs/memory.md +121 -0
  19. package/docs/opencode-go.md +61 -0
  20. package/docs/plugin-hub.md +68 -0
  21. package/docs/releases/0.2.0.md +28 -0
  22. package/docs/releases/0.3.0.md +21 -0
  23. package/docs/releases/0.4.0.md +20 -0
  24. package/docs/releases/0.5.0.md +19 -0
  25. package/docs/releases/0.6.0.md +20 -0
  26. package/docs/releases/0.7.0.md +22 -0
  27. package/docs/releases/0.7.1.md +20 -0
  28. package/docs/releases/0.7.10.md +10 -0
  29. package/docs/releases/0.7.11.md +17 -0
  30. package/docs/releases/0.7.12.md +11 -0
  31. package/docs/releases/0.7.13.md +12 -0
  32. package/docs/releases/0.7.14.md +11 -0
  33. package/docs/releases/0.7.15.md +11 -0
  34. package/docs/releases/0.7.16.md +10 -0
  35. package/docs/releases/0.7.17.md +12 -0
  36. package/docs/releases/0.7.18.md +13 -0
  37. package/docs/releases/0.7.19.md +8 -0
  38. package/docs/releases/0.7.2.md +19 -0
  39. package/docs/releases/0.7.20.md +10 -0
  40. package/docs/releases/0.7.21.md +9 -0
  41. package/docs/releases/0.7.22.md +11 -0
  42. package/docs/releases/0.7.23.md +14 -0
  43. package/docs/releases/0.7.24.md +11 -0
  44. package/docs/releases/0.7.25.md +8 -0
  45. package/docs/releases/0.7.26.md +18 -0
  46. package/docs/releases/0.7.27.md +8 -0
  47. package/docs/releases/0.7.28.md +22 -0
  48. package/docs/releases/0.7.29.md +12 -0
  49. package/docs/releases/0.7.3.md +23 -0
  50. package/docs/releases/0.7.30.md +19 -0
  51. package/docs/releases/0.7.31.md +14 -0
  52. package/docs/releases/0.7.32.md +14 -0
  53. package/docs/releases/0.7.33.md +37 -0
  54. package/docs/releases/0.7.34.md +24 -0
  55. package/docs/releases/0.7.4.md +16 -0
  56. package/docs/releases/0.7.5.md +18 -0
  57. package/docs/releases/0.7.6.md +29 -0
  58. package/docs/releases/0.7.7.md +36 -0
  59. package/docs/releases/0.7.8.md +14 -0
  60. package/docs/releases/0.7.9.md +15 -0
  61. package/docs/session-bridge.md +80 -0
  62. package/docs/session-cards.md +53 -0
  63. package/docs/session-communication.md +186 -0
  64. package/docs/session-metrics.md +41 -0
  65. package/docs/skills.md +81 -0
  66. package/docs/triggers.md +338 -0
  67. package/docs/tui-commands.md +204 -0
  68. package/extensions/browser/manifest.json +22 -0
  69. package/extensions/browser/popup.css +6 -0
  70. package/extensions/browser/popup.html +11 -0
  71. package/extensions/browser/popup.mjs +47 -0
  72. package/extensions/browser/protocol.mjs +168 -0
  73. package/extensions/browser/worker.mjs +94 -0
  74. package/icon.svg +7 -0
  75. package/locale/en.json +6 -0
  76. package/locale/zh-cn.json +6 -0
  77. package/node_modules/@deepseek-ai/node-addon-system/LICENSE +21 -0
  78. package/node_modules/@deepseek-ai/node-addon-system/README.i18n.yaml +6 -0
  79. package/node_modules/@deepseek-ai/node-addon-system/README.md +15 -0
  80. package/node_modules/@deepseek-ai/node-addon-system/README.zh.md +15 -0
  81. package/node_modules/@deepseek-ai/node-addon-system/lib/flock.d.ts +13 -0
  82. package/node_modules/@deepseek-ai/node-addon-system/lib/flock.js +51 -0
  83. package/node_modules/@deepseek-ai/node-addon-system/lib/index.d.ts +73 -0
  84. package/node_modules/@deepseek-ai/node-addon-system/lib/index.js +98 -0
  85. package/node_modules/@deepseek-ai/node-addon-system/package.json +45 -0
  86. package/node_modules/@deepseek-ai/node-addon-system/src/flock.c +164 -0
  87. package/node_modules/@deepseek-ai/node-addon-system/src/main.c +298 -0
  88. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/LICENSE +28 -0
  89. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.i18n.yaml +6 -0
  90. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.md +9 -0
  91. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.zh.md +9 -0
  92. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/bin/system.node +0 -0
  93. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/package.json +31 -0
  94. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/prebuilds.json +6 -0
  95. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/LICENSE +28 -0
  96. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.i18n.yaml +6 -0
  97. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.md +9 -0
  98. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.zh.md +9 -0
  99. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/bin/system.node +0 -0
  100. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/package.json +31 -0
  101. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/prebuilds.json +6 -0
  102. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/LICENSE +28 -0
  103. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.i18n.yaml +6 -0
  104. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.md +11 -0
  105. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.zh.md +11 -0
  106. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/glibc/system.node +0 -0
  107. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/landlock-run +0 -0
  108. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/musl/system.node +0 -0
  109. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/package.json +31 -0
  110. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/prebuilds.json +24 -0
  111. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/LICENSE +28 -0
  112. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.i18n.yaml +6 -0
  113. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.md +11 -0
  114. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.zh.md +11 -0
  115. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/glibc/system.node +0 -0
  116. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/landlock-run +0 -0
  117. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/musl/system.node +0 -0
  118. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/package.json +31 -0
  119. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/prebuilds.json +24 -0
  120. package/package.json +156 -4
  121. package/plugins/account/index.mjs +178 -0
  122. package/plugins/account/state.mjs +123 -0
  123. package/plugins/auto-review/audit.mjs +24 -0
  124. package/plugins/auto-review/index.mjs +267 -0
  125. package/plugins/auto-review/policy.mjs +92 -0
  126. package/plugins/browser/SKILL.md +158 -0
  127. package/plugins/browser/access.mjs +143 -0
  128. package/plugins/browser/config.mjs +60 -0
  129. package/plugins/browser/connection.mjs +385 -0
  130. package/plugins/browser/desktop-client.mjs +282 -0
  131. package/plugins/browser/desktop-host.mjs +74 -0
  132. package/plugins/browser/document-identity.mjs +57 -0
  133. package/plugins/browser/extension-relay.mjs +66 -0
  134. package/plugins/browser/files.mjs +32 -0
  135. package/plugins/browser/index.mjs +235 -0
  136. package/plugins/browser/mcp-entry.mjs +18 -0
  137. package/plugins/browser/mcp-tools.mjs +21 -0
  138. package/plugins/browser/presentation.mjs +45 -0
  139. package/plugins/browser/preview.mjs +77 -0
  140. package/plugins/browser/review.mjs +20 -0
  141. package/plugins/browser/screenshots.mjs +35 -0
  142. package/plugins/clipboard-image/clipboard-image.swift +56 -0
  143. package/plugins/clipboard-image/index.mjs +70 -0
  144. package/plugins/code-review/baseline.mjs +143 -0
  145. package/plugins/code-review/git.mjs +163 -0
  146. package/plugins/code-review/index.mjs +236 -0
  147. package/plugins/compaction/engine.mjs +304 -0
  148. package/plugins/compaction/tetris.mjs +65 -0
  149. package/plugins/compaction/threshold.mjs +99 -0
  150. package/plugins/computer-use/DESKTOP-SKILL.md +64 -0
  151. package/plugins/computer-use/desktop-host.mjs +75 -0
  152. package/plugins/computer-use/desktop-skill.mjs +28 -0
  153. package/plugins/computer-use/desktop-upstream.mjs +3 -0
  154. package/plugins/computer-use/index.mjs +37 -0
  155. package/plugins/cordis-config/plain.mjs +31 -0
  156. package/plugins/credentials/index.mjs +73 -0
  157. package/plugins/custom/adapter.mjs +110 -0
  158. package/plugins/custom/config.mjs +85 -0
  159. package/plugins/custom/desktop-client.mjs +150 -0
  160. package/plugins/custom/desktop-host.mjs +78 -0
  161. package/plugins/custom/images.mjs +32 -0
  162. package/plugins/custom/index.mjs +145 -0
  163. package/plugins/custom/wire.mjs +179 -0
  164. package/plugins/desktop/client.mjs +1041 -0
  165. package/plugins/desktop/index.mjs +10 -0
  166. package/plugins/desktop/shell-environment.mjs +9 -0
  167. package/plugins/desktop-workspace/hooks.mjs +29 -0
  168. package/plugins/desktop-workspace/index.mjs +37 -0
  169. package/plugins/dscode/board.mjs +260 -0
  170. package/plugins/dscode/child-target.mjs +11 -0
  171. package/plugins/dscode/control.mjs +17 -0
  172. package/plugins/dscode/desktop-client.mjs +55 -0
  173. package/plugins/dscode/desktop-host.mjs +37 -0
  174. package/plugins/dscode/index.mjs +270 -0
  175. package/plugins/email/cli.mjs +32 -0
  176. package/plugins/email/contacts.mjs +36 -0
  177. package/plugins/email/desktop-client.mjs +117 -0
  178. package/plugins/email/desktop-host.mjs +54 -0
  179. package/plugins/email/desktop-service.mjs +106 -0
  180. package/plugins/email/gmail-oauth.mjs +69 -0
  181. package/plugins/email/gmail-store.mjs +2 -0
  182. package/plugins/email/gmail.mjs +194 -0
  183. package/plugins/email/imap.mjs +136 -0
  184. package/plugins/email/inbox.d.mts +25 -0
  185. package/plugins/email/inbox.mjs +76 -0
  186. package/plugins/email/smtp.mjs +70 -0
  187. package/plugins/email/store.mjs +32 -0
  188. package/plugins/email-tools/index.mjs +46 -0
  189. package/plugins/exec/cli.mjs +64 -0
  190. package/plugins/exec/index.mjs +112 -0
  191. package/plugins/grok/adapter.mjs +114 -0
  192. package/plugins/grok/auth.mjs +76 -0
  193. package/plugins/grok/billing.mjs +147 -0
  194. package/plugins/grok/index.mjs +123 -0
  195. package/plugins/grok/models.mjs +129 -0
  196. package/plugins/grok/status.mjs +29 -0
  197. package/plugins/grok/wire.mjs +268 -0
  198. package/plugins/hub/catalog.mjs +82 -0
  199. package/plugins/hub/desktop-client.mjs +114 -0
  200. package/plugins/hub/desktop-host.mjs +129 -0
  201. package/plugins/i18n/messages.d.mts +21 -0
  202. package/plugins/i18n/messages.mjs +537 -0
  203. package/plugins/jev/approval.mjs +131 -0
  204. package/plugins/jev/client.mjs +74 -0
  205. package/plugins/jev/index.mjs +100 -0
  206. package/plugins/memory/content.mjs +57 -0
  207. package/plugins/memory/desktop-host.mjs +3 -0
  208. package/plugins/memory/index.mjs +168 -0
  209. package/plugins/memory/pipeline.mjs +79 -0
  210. package/plugins/memory/store.mjs +93 -0
  211. package/plugins/message-source/kind.mjs +20 -0
  212. package/plugins/opencode-go/adapter.mjs +96 -0
  213. package/plugins/opencode-go/command.mjs +128 -0
  214. package/plugins/opencode-go/index.mjs +121 -0
  215. package/plugins/opencode-go/models.mjs +58 -0
  216. package/plugins/opencode-go/oauth.mjs +194 -0
  217. package/plugins/opencode-go/search.mjs +86 -0
  218. package/plugins/opencode-go/usage.mjs +120 -0
  219. package/plugins/opencode-go/version.mjs +10 -0
  220. package/plugins/opencode-go/wire.mjs +73 -0
  221. package/plugins/openrouter/adapter.mjs +232 -0
  222. package/plugins/openrouter/index.mjs +124 -0
  223. package/plugins/openrouter/models.mjs +157 -0
  224. package/plugins/openrouter/search.mjs +113 -0
  225. package/plugins/openrouter/wire.mjs +101 -0
  226. package/plugins/providers/catalog.mjs +160 -0
  227. package/plugins/providers/chat-messages.mjs +120 -0
  228. package/plugins/providers/chat-stream.mjs +174 -0
  229. package/plugins/providers/desktop-client.mjs +84 -0
  230. package/plugins/providers/desktop-host.mjs +63 -0
  231. package/plugins/providers/effort.mjs +35 -0
  232. package/plugins/providers/http-errors.mjs +50 -0
  233. package/plugins/providers/openrouter-account.mjs +171 -0
  234. package/plugins/session-bridge/client.mjs +106 -0
  235. package/plugins/session-bridge/communication.mjs +260 -0
  236. package/plugins/session-bridge/index.mjs +67 -0
  237. package/plugins/session-bridge/mailbox.mjs +267 -0
  238. package/plugins/session-bridge/paths.mjs +21 -0
  239. package/plugins/session-bridge/server.mjs +172 -0
  240. package/plugins/session-bridge/tasks.mjs +229 -0
  241. package/plugins/session-cards/content.mjs +64 -0
  242. package/plugins/session-cards/index.mjs +38 -0
  243. package/plugins/session-cards/manager.mjs +140 -0
  244. package/plugins/session-metrics/attribution.mjs +30 -0
  245. package/plugins/session-metrics/balance.mjs +81 -0
  246. package/plugins/session-metrics/desktop-client.mjs +62 -0
  247. package/plugins/session-metrics/desktop-host.mjs +46 -0
  248. package/plugins/session-metrics/index.mjs +97 -0
  249. package/plugins/session-metrics/pricing.mjs +84 -0
  250. package/plugins/session-metrics/rate.mjs +59 -0
  251. package/plugins/session-metrics/store.mjs +75 -0
  252. package/plugins/session-metrics/turns.mjs +134 -0
  253. package/plugins/session-metrics/view.mjs +272 -0
  254. package/plugins/time-marks/desktop-host.mjs +2 -0
  255. package/plugins/time-marks/index.mjs +116 -0
  256. package/plugins/time-marks/marks.mjs +152 -0
  257. package/plugins/triggers/cli.mjs +558 -0
  258. package/plugins/triggers/commands.mjs +143 -0
  259. package/plugins/triggers/config.mjs +264 -0
  260. package/plugins/triggers/desktop-client.mjs +155 -0
  261. package/plugins/triggers/desktop-host.mjs +88 -0
  262. package/plugins/triggers/desktop-management.mjs +97 -0
  263. package/plugins/triggers/desktop-scheduler.mjs +125 -0
  264. package/plugins/triggers/host.mjs +24 -0
  265. package/plugins/triggers/index.mjs +27 -0
  266. package/plugins/triggers/job-cli.mjs +110 -0
  267. package/plugins/triggers/jobs.mjs +156 -0
  268. package/plugins/triggers/launchd.mjs +101 -0
  269. package/plugins/triggers/lease.mjs +24 -0
  270. package/plugins/triggers/log.mjs +104 -0
  271. package/plugins/triggers/management.mjs +181 -0
  272. package/plugins/triggers/options.mjs +117 -0
  273. package/plugins/triggers/overlay.mjs +7 -0
  274. package/plugins/triggers/poll.mjs +65 -0
  275. package/plugins/triggers/run.mjs +157 -0
  276. package/plugins/triggers/schedule.mjs +40 -0
  277. package/plugins/triggers/scheduler-service.mjs +46 -0
  278. package/plugins/triggers/scheduler.mjs +92 -0
  279. package/plugins/triggers/session-run.mjs +125 -0
  280. package/plugins/triggers/session.mjs +48 -0
  281. package/plugins/triggers/source-emit.mjs +19 -0
  282. package/plugins/triggers/source-host.mjs +78 -0
  283. package/plugins/triggers/source-ingress.mjs +70 -0
  284. package/plugins/triggers/source-sandbox.mjs +35 -0
  285. package/plugins/triggers/sources.mjs +45 -0
  286. package/plugins/triggers/spool.mjs +145 -0
  287. package/plugins/triggers/tools.mjs +67 -0
  288. package/plugins/triggers/unattended.mjs +18 -0
  289. package/plugins/tui-tools/composition.mjs +28 -0
  290. package/plugins/tui-tools/desktop-host.mjs +2 -0
  291. package/plugins/tui-tools/doctor-cli.mjs +22 -0
  292. package/plugins/tui-tools/doctor.mjs +149 -0
  293. package/plugins/tui-tools/hook-sources.mjs +113 -0
  294. package/plugins/tui-tools/hooks.mjs +23 -0
  295. package/plugins/tui-tools/index.mjs +269 -0
  296. package/plugins/tui-tools/sandbox-runner.mjs +123 -0
  297. package/plugins/tui-tools/shell.mjs +27 -0
  298. package/plugins/tui-tools/update.mjs +111 -0
  299. package/plugins/tui-tools/workspace-discovery.mjs +129 -0
  300. package/plugins/ultra/policy.mjs +42 -0
  301. package/plugins/worktree-subagent/worktree.mjs +56 -0
  302. package/runtime-sources.json +94 -0
  303. package/vendor/bash/LICENSE +21 -0
  304. package/vendor/bash/index.js +717 -0
  305. package/vendor/bash/types/background.d.ts +50 -0
  306. package/vendor/bash/types/index.d.ts +38 -0
  307. package/vendor/bash/types/render.d.ts +57 -0
  308. package/vendor/command-goal/LICENSE +21 -0
  309. package/vendor/command-goal/index.js +210 -0
  310. package/vendor/command-goal/types/index.d.ts +10 -0
  311. package/vendor/computer-use/LICENSE +21 -0
  312. package/vendor/computer-use/lib/approval-policy.js +12 -0
  313. package/vendor/computer-use/lib/approval-policy.js.map +1 -0
  314. package/vendor/computer-use/lib/artifacts.js +79 -0
  315. package/vendor/computer-use/lib/artifacts.js.map +1 -0
  316. package/vendor/computer-use/lib/backend.js +3 -0
  317. package/vendor/computer-use/lib/backend.js.map +1 -0
  318. package/vendor/computer-use/lib/client.js +369 -0
  319. package/vendor/computer-use/lib/client.js.map +1 -0
  320. package/vendor/computer-use/lib/config.js +159 -0
  321. package/vendor/computer-use/lib/config.js.map +1 -0
  322. package/vendor/computer-use/lib/confirmations.js +99 -0
  323. package/vendor/computer-use/lib/confirmations.js.map +1 -0
  324. package/vendor/computer-use/lib/diff.js +58 -0
  325. package/vendor/computer-use/lib/diff.js.map +1 -0
  326. package/vendor/computer-use/lib/errors.js +22 -0
  327. package/vendor/computer-use/lib/errors.js.map +1 -0
  328. package/vendor/computer-use/lib/exposure.js +244 -0
  329. package/vendor/computer-use/lib/exposure.js.map +1 -0
  330. package/vendor/computer-use/lib/index.js +66 -0
  331. package/vendor/computer-use/lib/index.js.map +1 -0
  332. package/vendor/computer-use/lib/leases.js +262 -0
  333. package/vendor/computer-use/lib/leases.js.map +1 -0
  334. package/vendor/computer-use/lib/providers/macos.js +243 -0
  335. package/vendor/computer-use/lib/providers/macos.js.map +1 -0
  336. package/vendor/computer-use/lib/providers/native-helper.js +726 -0
  337. package/vendor/computer-use/lib/providers/native-helper.js.map +1 -0
  338. package/vendor/computer-use/lib/providers/unsupported.js +51 -0
  339. package/vendor/computer-use/lib/providers/unsupported.js.map +1 -0
  340. package/vendor/computer-use/lib/service.js +608 -0
  341. package/vendor/computer-use/lib/service.js.map +1 -0
  342. package/vendor/computer-use/lib/skill.js +136 -0
  343. package/vendor/computer-use/lib/skill.js.map +1 -0
  344. package/vendor/computer-use/lib/target-resolver.js +180 -0
  345. package/vendor/computer-use/lib/target-resolver.js.map +1 -0
  346. package/vendor/computer-use/lib/tools.js +511 -0
  347. package/vendor/computer-use/lib/tools.js.map +1 -0
  348. package/vendor/computer-use/lib/types/approval-policy.d.ts +13 -0
  349. package/vendor/computer-use/lib/types/approval-policy.d.ts.map +1 -0
  350. package/vendor/computer-use/lib/types/artifacts.d.ts +10 -0
  351. package/vendor/computer-use/lib/types/artifacts.d.ts.map +1 -0
  352. package/vendor/computer-use/lib/types/backend.d.ts +124 -0
  353. package/vendor/computer-use/lib/types/backend.d.ts.map +1 -0
  354. package/vendor/computer-use/lib/types/client/index.d.ts +83 -0
  355. package/vendor/computer-use/lib/types/client/index.d.ts.map +1 -0
  356. package/vendor/computer-use/lib/types/config.d.ts +94 -0
  357. package/vendor/computer-use/lib/types/config.d.ts.map +1 -0
  358. package/vendor/computer-use/lib/types/confirmations.d.ts +23 -0
  359. package/vendor/computer-use/lib/types/confirmations.d.ts.map +1 -0
  360. package/vendor/computer-use/lib/types/diff.d.ts +5 -0
  361. package/vendor/computer-use/lib/types/diff.d.ts.map +1 -0
  362. package/vendor/computer-use/lib/types/errors.d.ts +15 -0
  363. package/vendor/computer-use/lib/types/errors.d.ts.map +1 -0
  364. package/vendor/computer-use/lib/types/exposure.d.ts +30 -0
  365. package/vendor/computer-use/lib/types/exposure.d.ts.map +1 -0
  366. package/vendor/computer-use/lib/types/index.d.ts +21 -0
  367. package/vendor/computer-use/lib/types/index.d.ts.map +1 -0
  368. package/vendor/computer-use/lib/types/leases.d.ts +81 -0
  369. package/vendor/computer-use/lib/types/leases.d.ts.map +1 -0
  370. package/vendor/computer-use/lib/types/providers/macos.d.ts +39 -0
  371. package/vendor/computer-use/lib/types/providers/macos.d.ts.map +1 -0
  372. package/vendor/computer-use/lib/types/providers/native-helper.d.ts +48 -0
  373. package/vendor/computer-use/lib/types/providers/native-helper.d.ts.map +1 -0
  374. package/vendor/computer-use/lib/types/providers/unsupported.d.ts +23 -0
  375. package/vendor/computer-use/lib/types/providers/unsupported.d.ts.map +1 -0
  376. package/vendor/computer-use/lib/types/service.d.ts +58 -0
  377. package/vendor/computer-use/lib/types/service.d.ts.map +1 -0
  378. package/vendor/computer-use/lib/types/skill.d.ts +14 -0
  379. package/vendor/computer-use/lib/types/skill.d.ts.map +1 -0
  380. package/vendor/computer-use/lib/types/target-resolver.d.ts +38 -0
  381. package/vendor/computer-use/lib/types/target-resolver.d.ts.map +1 -0
  382. package/vendor/computer-use/lib/types/tools.d.ts +6 -0
  383. package/vendor/computer-use/lib/types/tools.d.ts.map +1 -0
  384. package/vendor/computer-use/lib/types/types.d.ts +270 -0
  385. package/vendor/computer-use/lib/types/types.d.ts.map +1 -0
  386. package/vendor/computer-use/lib/types/web.d.ts +33 -0
  387. package/vendor/computer-use/lib/types/web.d.ts.map +1 -0
  388. package/vendor/computer-use/lib/types.js +9 -0
  389. package/vendor/computer-use/lib/types.js.map +1 -0
  390. package/vendor/computer-use/lib/web.js +188 -0
  391. package/vendor/computer-use/lib/web.js.map +1 -0
  392. package/vendor/computer-use/native/macos/Sources/Fixture/main.swift +412 -0
  393. package/vendor/computer-use/native/macos/Sources/Helper/CursorImage.swift +11 -0
  394. package/vendor/computer-use/native/macos/Sources/Helper/CursorMotion.swift +67 -0
  395. package/vendor/computer-use/native/macos/Sources/Helper/CursorOverlay.swift +840 -0
  396. package/vendor/computer-use/native/macos/Sources/Helper/TargetedPointer.swift +327 -0
  397. package/vendor/computer-use/native/macos/Sources/Helper/WindowNumberMatcher.swift +29 -0
  398. package/vendor/computer-use/native/macos/Sources/Helper/main.swift +1244 -0
  399. package/vendor/computer-use/native/macos/Sources/Monitor/main.swift +153 -0
  400. package/vendor/computer-use/native/macos/bin/dsh-computer-use-helper +0 -0
  401. package/vendor/computer-use/native/macos/manifest.json +14 -0
  402. package/vendor/persistent/LICENSE +21 -0
  403. package/vendor/persistent/index.js +411 -0
  404. package/vendor/persistent/types/index.d.ts +24 -0
  405. package/vendor/subagent/LICENSE +21 -0
  406. package/vendor/subagent/index.js +694 -0
  407. package/vendor/subagent/invariant.js +52 -0
  408. package/vendor/subagent/model-selection-settings.js +68 -0
  409. package/vendor/subagent/types/index.d.ts +82 -0
  410. package/vendor/subagent/types/invariant.d.ts +16 -0
  411. package/vendor/subagent/types/list-models.d.ts +10 -0
  412. package/vendor/subagent/types/model-selection-settings.d.ts +45 -0
  413. package/vendor/subagent/types/model-selection-state.d.ts +48 -0
  414. package/vendor/subagent/types/model-selection.d.ts +81 -0
  415. package/vendor/subagent-core/LICENSE +21 -0
  416. package/vendor/subagent-core/index.js +3202 -0
  417. package/vendor/subagent-core/invariant.js +76 -0
  418. package/vendor/subagent-core/typert.host.d.ts +3 -0
  419. package/vendor/subagent-core/typert.host.js +978 -0
  420. package/vendor/subagent-core/typert.remote-client.d.ts +25 -0
  421. package/vendor/subagent-core/typert.remote-client.js +114 -0
  422. package/vendor/subagent-core/types/archive-admission.d.ts +16 -0
  423. package/vendor/subagent-core/types/archive-admission.js +151 -0
  424. package/vendor/subagent-core/types/assistant-output.d.ts +48 -0
  425. package/vendor/subagent-core/types/assistant-output.js +73 -0
  426. package/vendor/subagent-core/types/catalog.d.ts +84 -0
  427. package/vendor/subagent-core/types/catalog.js +109 -0
  428. package/vendor/subagent-core/types/child-agent.d.ts +156 -0
  429. package/vendor/subagent-core/types/child-agent.js +213 -0
  430. package/vendor/subagent-core/types/client.d.ts +8 -0
  431. package/vendor/subagent-core/types/client.js +7 -0
  432. package/vendor/subagent-core/types/continuation-activation.d.ts +267 -0
  433. package/vendor/subagent-core/types/continuation-activation.js +700 -0
  434. package/vendor/subagent-core/types/continuation-messages.d.ts +62 -0
  435. package/vendor/subagent-core/types/continuation-messages.js +106 -0
  436. package/vendor/subagent-core/types/continuation.d.ts +124 -0
  437. package/vendor/subagent-core/types/continuation.js +455 -0
  438. package/vendor/subagent-core/types/control-types.d.ts +135 -0
  439. package/vendor/subagent-core/types/control-types.js +8 -0
  440. package/vendor/subagent-core/types/control.d.ts +45 -0
  441. package/vendor/subagent-core/types/control.js +79 -0
  442. package/vendor/subagent-core/types/depth.d.ts +31 -0
  443. package/vendor/subagent-core/types/depth.js +39 -0
  444. package/vendor/subagent-core/types/descriptor.d.ts +144 -0
  445. package/vendor/subagent-core/types/descriptor.js +193 -0
  446. package/vendor/subagent-core/types/error.d.ts +11 -0
  447. package/vendor/subagent-core/types/error.js +14 -0
  448. package/vendor/subagent-core/types/inbox.d.ts +43 -0
  449. package/vendor/subagent-core/types/inbox.js +61 -0
  450. package/vendor/subagent-core/types/index.d.ts +320 -0
  451. package/vendor/subagent-core/types/index.js +475 -0
  452. package/vendor/subagent-core/types/internal.d.ts +58 -0
  453. package/vendor/subagent-core/types/internal.js +58 -0
  454. package/vendor/subagent-core/types/invariant.d.ts +13 -0
  455. package/vendor/subagent-core/types/invariant.js +91 -0
  456. package/vendor/subagent-core/types/lifecycle.d.ts +113 -0
  457. package/vendor/subagent-core/types/lifecycle.js +180 -0
  458. package/vendor/subagent-core/types/list-children.d.ts +36 -0
  459. package/vendor/subagent-core/types/list-children.js +166 -0
  460. package/vendor/subagent-core/types/out-of-process.d.ts +118 -0
  461. package/vendor/subagent-core/types/out-of-process.js +219 -0
  462. package/vendor/subagent-core/types/projection-types.d.ts +82 -0
  463. package/vendor/subagent-core/types/projection-types.js +7 -0
  464. package/vendor/subagent-core/types/projection.d.ts +100 -0
  465. package/vendor/subagent-core/types/projection.js +157 -0
  466. package/vendor/subagent-core/types/run-settlement.d.ts +17 -0
  467. package/vendor/subagent-core/types/run-settlement.js +70 -0
  468. package/vendor/subagent-core/types/types.d.ts +377 -0
  469. package/vendor/subagent-core/types/types.js +19 -0
  470. package/vendor/subagent-driver/LICENSE +21 -0
  471. package/vendor/subagent-driver/index.js +255 -0
  472. package/vendor/subagent-driver/types/index.d.ts +33 -0
  473. package/vendor/subagent-driver/types/structured.d.ts +42 -0
  474. package/vendor/subagent-fork/LICENSE +21 -0
  475. package/vendor/subagent-fork/index.js +61 -0
  476. package/vendor/subagent-fork/types/index.d.ts +20 -0
  477. package/vendor/subagent-spawn/LICENSE +21 -0
  478. package/vendor/subagent-spawn/index.js +45 -0
  479. package/vendor/subagent-spawn/types/index.d.ts +19 -0
  480. package/vendor/terminal/LICENSE +21 -0
  481. package/vendor/terminal/index.js +1093 -0
  482. package/vendor/terminal/types/config.d.ts +82 -0
  483. package/vendor/terminal/types/index.d.ts +36 -0
  484. package/vendor/terminal/types/sanitize.d.ts +47 -0
  485. 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.