@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,10 @@
1
+ import { apply as customSettings } from '../custom/desktop-host.mjs';
2
+ import { apply as browserPreview } from '../browser/desktop-host.mjs';
3
+ import { apply as providerAccounts } from '../providers/desktop-host.mjs';
4
+
5
+ export const inject = ['agents', 'commands'];
6
+ export function apply(ctx) {
7
+ customSettings(ctx);
8
+ browserPreview(ctx);
9
+ providerAccounts(ctx);
10
+ }
@@ -0,0 +1,9 @@
1
+ import { delimiter } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const bin = fileURLToPath(new URL('../../bin/', import.meta.url));
5
+
6
+ /** Only DSCODE's copied shell providers receive the bundled helper directory. */
7
+ export function desktopShellEnvironment(environment = process.env) {
8
+ return { PATH: bin + delimiter + (environment.PATH ?? '') };
9
+ }
@@ -0,0 +1,29 @@
1
+ import { apply as applyHooks } from '@deepseek-ai/dsh-hooks-codex';
2
+
3
+ /** Reuse the native hook protocol while binding registrations to one Agent. */
4
+ export async function mountWorkspaceHooks(agentContext, configPath, creation) {
5
+ await agentContext.plugin({
6
+ name: 'dscode-workspace-hooks',
7
+ inject: ['shell', 'sessionProjections'],
8
+ async apply(scope) {
9
+ let sessionStart;
10
+ // Hooks are mounted during agent/created, after that dispatch collected
11
+ // its listeners. Invoke only the newly registered SessionStart callback;
12
+ // re-emitting agent/created would repeat unrelated lifecycle handlers.
13
+ applyHooks({
14
+ shell: scope.shell,
15
+ sessionProjections: scope.sessionProjections,
16
+ logger: scope.logger,
17
+ effect: scope.effect.bind(scope),
18
+ on(event, listener, ...options) {
19
+ if (event === 'agent/created') {
20
+ sessionStart = listener;
21
+ return () => {};
22
+ }
23
+ return scope.on(event, listener, ...options);
24
+ },
25
+ }, { configPath, defaultTimeoutMs: 10000, stderrSummaryMaxChars: 500 });
26
+ await sessionStart?.(creation);
27
+ },
28
+ });
29
+ }
@@ -0,0 +1,37 @@
1
+ import { resolveDshHome } from '@deepseek-ai/dsh-home-paths';
2
+ import { createHash } from 'node:crypto';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
6
+ import * as Instructions from '@deepseek-ai/dsh-agent-instructions';
7
+ import * as FilesystemSkills from '@deepseek-ai/dsh-skill-filesystem';
8
+ import { ancestorSkillDirs, writeWorkspaceInstructions } from '../tui-tools/workspace-discovery.mjs';
9
+ import { writeHookConfig } from '../tui-tools/hook-sources.mjs';
10
+ import { mountWorkspaceHooks } from './hooks.mjs';
11
+
12
+ export const name = 'dscode-desktop-workspace';
13
+ export const inject = ['agents', 'agentPresets', 'skills', 'sessionProjections', 'shell'];
14
+
15
+ /** Session-owned discovery; Desktop's process cwd is not a workspace identity. */
16
+ export function apply(ctx) {
17
+ const stateDir = resolveDshHome();
18
+ mkdirSync(join(stateDir, 'config'), { recursive: true });
19
+ const installationHooks = join(stateDir, 'config/hooks.local.json');
20
+ if (!existsSync(installationHooks)) writeFileSync(installationHooks, '{"hooks":{}}\n', { mode: 0o600, flag: 'wx' });
21
+ ctx.on('agent/created', async payload => {
22
+ const { agent } = payload;
23
+ if (ctx.agentPresets.composedPreset(agent.ctx) !== 'dscode') return;
24
+ const cwd = agent.session.header.cwd;
25
+ if (!cwd) throw Error('DSCODE Desktop sessions require a workspace directory');
26
+ const home = homedir();
27
+ const key = createHash('sha256').update(JSON.stringify([agent.session.id, resolve(cwd)])).digest('hex');
28
+ const directory = join(stateDir, 'desktop-workspaces', key);
29
+ const outputDir = join(directory, 'instructions');
30
+ const instructionHome = writeWorkspaceInstructions({ cwd, home, stateDir, outputDir }) ?? stateDir;
31
+ agent.ctx.effect(() => () => rmSync(directory, { recursive: true, force: true }));
32
+ await agent.ctx.plugin(Instructions, { dshHome: instructionHome, maxBytes: 65536 });
33
+ await agent.ctx.plugin(FilesystemSkills, { customSkillDirs: ancestorSkillDirs({ cwd, home }) });
34
+ const hooks = writeHookConfig({ root: stateDir, cwd, home: directory });
35
+ await mountWorkspaceHooks(agent.ctx, hooks.path, payload);
36
+ });
37
+ }
@@ -0,0 +1,260 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { join } from 'node:path';
4
+ import { scopeChainOf } from '@deepseek-ai/dsh-scope';
5
+
6
+ export const COLUMNS = ['pending', 'running', 'verifying', 'complete'];
7
+ export const PRIORITIES = ['high', 'normal', 'low'];
8
+ const MAX_TASKS = 50;
9
+ const rank = task => PRIORITIES.indexOf(task.priority ?? 'normal');
10
+ const order = (a, b) => (a.urgency ?? rank(a)) - (b.urgency ?? rank(b)) || Number(a.id.slice(1)) - Number(b.id.slice(1));
11
+
12
+ /**
13
+ * Each open task's effective rank: its own priority or that of any open task that
14
+ * (transitively) waits on it, whichever is higher, so work that unblocks a
15
+ * high-priority task is launched first.
16
+ */
17
+ export function urgency(tasks) {
18
+ const open = tasks.filter(task => task.stage !== 'complete');
19
+ const dependents = new Map(open.map(task => [task.id, []]));
20
+ for (const task of open) for (const id of task.dependsOn ?? []) dependents.get(id)?.push(task);
21
+ const memo = new Map();
22
+ const visit = (task, seen) => {
23
+ if (memo.has(task.id)) return memo.get(task.id);
24
+ let best = rank(task);
25
+ for (const next of dependents.get(task.id) ?? []) if (!seen.has(next.id)) best = Math.min(best, visit(next, new Set([...seen, next.id])));
26
+ memo.set(task.id, best);
27
+ return best;
28
+ };
29
+ return new Map(open.map(task => [task.id, visit(task, new Set([task.id]))]));
30
+ }
31
+ const priority = value => {
32
+ if (value === undefined) return 'normal';
33
+ if (!PRIORITIES.includes(value)) throw new Error(`priority must be one of ${PRIORITIES.join(', ')}`);
34
+ return value;
35
+ };
36
+ const text = (value, label, max) => {
37
+ if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} is required`);
38
+ if (value.length > max) throw new Error(`${label} exceeds ${max} characters`);
39
+ return value.trim();
40
+ };
41
+
42
+ // One delegate board per root session. A task is stored as pending, launched or
43
+ // complete; running and verifying are read from the child agent, so the board
44
+ // cannot drift from what the children are actually doing. A pending task is
45
+ // ready once every task it depends on is complete, and blocked until then.
46
+ export class DelegateBoard {
47
+ constructor({ root, childName = /^[A-Za-z](?:[A-Za-z0-9_]{0,8}[A-Za-z])?$/ }) {
48
+ this.root = root; this.childName = childName; this.boards = new Map(); this.listeners = new Set();
49
+ mkdirSync(root, { recursive: true, mode: 0o700 });
50
+ }
51
+ path(sessionId) { return join(this.root, createHash('sha256').update(sessionId).digest('hex').slice(0, 32) + '.json'); }
52
+ load(sessionId) {
53
+ if (!this.boards.has(sessionId)) {
54
+ let tasks = [];
55
+ try { tasks = JSON.parse(readFileSync(this.path(sessionId), 'utf8')).tasks ?? []; } catch { /* No board yet. */ }
56
+ this.boards.set(sessionId, { tasks });
57
+ }
58
+ return this.boards.get(sessionId);
59
+ }
60
+ save(sessionId) {
61
+ const path = this.path(sessionId), tmp = `${path}.${randomUUID()}.tmp`;
62
+ writeFileSync(tmp, JSON.stringify({ version: 1, sessionId, tasks: this.load(sessionId).tasks }), { mode: 0o600 });
63
+ renameSync(tmp, path);
64
+ for (const listener of this.listeners) try { listener(sessionId); } catch { /* A viewer must not break the board. */ }
65
+ }
66
+ onChange(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
67
+ task(sessionId, id) {
68
+ const found = this.load(sessionId).tasks.find(task => task.id === id);
69
+ if (!found) throw new Error(`Unknown task ${id}`);
70
+ return found;
71
+ }
72
+ checkName(sessionId, name, except) {
73
+ if (typeof name !== 'string' || !this.childName.test(name)) throw new Error('child name must be 1-10 characters of letters, digits or underscores, starting and ending with a letter');
74
+ if (this.load(sessionId).tasks.some(task => task !== except && task.stage !== 'complete' && task.child === name)) throw new Error(`child name /${name} is already planned for an open task`);
75
+ return name;
76
+ }
77
+ /** Task ids for `depends_on` entries, each a task id (t3) or a planned child name, open tasks first. */
78
+ resolve(tasks, refs, self) {
79
+ if (refs === undefined) return [];
80
+ if (!Array.isArray(refs)) throw new Error('depends_on must be an array of task ids or child names');
81
+ const ids = [];
82
+ for (const ref of refs) {
83
+ const found = tasks.find(task => task.id === ref)
84
+ ?? tasks.find(task => task.stage !== 'complete' && task.child === ref)
85
+ ?? tasks.findLast(task => task.child === ref);
86
+ if (!found) throw new Error(`depends_on names no task: ${ref}`);
87
+ if (found === self) throw new Error(`${self.id} cannot depend on itself`);
88
+ if (!ids.includes(found.id)) ids.push(found.id);
89
+ }
90
+ return ids;
91
+ }
92
+ /** Reject a dependency cycle, naming it. */
93
+ acyclic(tasks) {
94
+ const byId = new Map(tasks.map(task => [task.id, task]));
95
+ const state = new Map();
96
+ const visit = (task, path) => {
97
+ if (state.get(task.id) === 'done') return;
98
+ if (state.get(task.id) === 'active') throw new Error(`dependency cycle: ${[...path, task.id].join(' → ')}`);
99
+ state.set(task.id, 'active');
100
+ for (const id of task.dependsOn ?? []) if (byId.has(id)) visit(byId.get(id), [...path, task.id]);
101
+ state.set(task.id, 'done');
102
+ };
103
+ for (const task of tasks) visit(task, []);
104
+ }
105
+ add(sessionId, items) {
106
+ const board = this.load(sessionId);
107
+ if (!Array.isArray(items) || !items.length) throw new Error('tasks must be a non-empty array');
108
+ if (board.tasks.length + items.length > MAX_TASKS) throw new Error(`a board holds at most ${MAX_TASKS} tasks`);
109
+ let next = board.tasks.reduce((max, task) => Math.max(max, Number(task.id.slice(1))), 0);
110
+ const added = [];
111
+ for (const item of items) {
112
+ const task = { id: `t${++next}`, title: text(item?.title, 'title', 120), stage: 'pending', priority: priority(item?.priority), updatedAt: Date.now() };
113
+ task.child = this.checkName(sessionId, item?.child, task);
114
+ if (added.some(other => other.child === task.child)) throw new Error(`child name /${task.child} is used twice`);
115
+ if (item.detail !== undefined) task.detail = text(item.detail, 'detail', 2000);
116
+ added.push(task);
117
+ }
118
+ // Dependencies may name tasks of the same batch, so they resolve once every id exists.
119
+ const all = [...board.tasks, ...added];
120
+ items.forEach((item, index) => { added[index].dependsOn = this.resolve(all, item.depends_on, added[index]); });
121
+ this.acyclic(all);
122
+ board.tasks.push(...added);
123
+ this.save(sessionId);
124
+ return added;
125
+ }
126
+ /** Change a pending task's priority or dependencies. */
127
+ update(sessionId, id, { priority: nextPriority, depends_on: refs }) {
128
+ const board = this.load(sessionId);
129
+ const task = this.task(sessionId, id);
130
+ if (task.stage !== 'pending') throw new Error(`Task ${id} is ${task.stage}; only a pending task can be re-planned`);
131
+ const updated = { ...task,
132
+ ...(nextPriority === undefined ? {} : { priority: priority(nextPriority) }),
133
+ ...(refs === undefined ? {} : { dependsOn: this.resolve(board.tasks, refs, task) }),
134
+ };
135
+ this.acyclic(board.tasks.map(current => current === task ? updated : current));
136
+ Object.assign(task, updated, { updatedAt: Date.now() });
137
+ this.save(sessionId);
138
+ return task;
139
+ }
140
+ /** Dependencies of `task` that are not complete yet. */
141
+ blockers(sessionId, task) {
142
+ const tasks = this.load(sessionId).tasks;
143
+ return (task.dependsOn ?? []).filter(id => tasks.find(other => other.id === id)?.stage !== 'complete');
144
+ }
145
+ /** Why launching `child` must wait, or undefined when its task is ready or it has none. */
146
+ launchBlocked(sessionId, child) {
147
+ const task = this.load(sessionId).tasks.find(t => t.stage === 'pending' && t.child === child);
148
+ const waits = task ? this.blockers(sessionId, task) : [];
149
+ return waits.length ? `Task ${task.id} /${child} depends on ${waits.join(', ')}, which ${waits.length === 1 ? 'is' : 'are'} not complete yet. Launch a ready task instead, or change the plan with delegate_board update.` : undefined;
150
+ }
151
+ /** A subagent started under a pending task's planned name takes that task. */
152
+ launched(sessionId, child, subagentId, worktree) {
153
+ const task = this.load(sessionId).tasks.find(t => t.stage === 'pending' && t.child === child);
154
+ if (!task) return undefined;
155
+ Object.assign(task, { stage: 'launched', subagentId, waiting: false, updatedAt: Date.now(), ...(worktree ? { worktree } : {}) });
156
+ this.save(sessionId);
157
+ return task;
158
+ }
159
+ /** Questions from a child keep its task running until the parent answers. */
160
+ waiting(sessionId, subagentId, value) {
161
+ const task = this.load(sessionId).tasks.find(t => t.stage === 'launched' && t.subagentId === subagentId);
162
+ if (!task || task.waiting === value) return;
163
+ Object.assign(task, { waiting: value, updatedAt: Date.now() });
164
+ this.save(sessionId);
165
+ }
166
+ complete(sessionId, id, verification) {
167
+ const task = this.task(sessionId, id);
168
+ if (task.stage !== 'launched') throw new Error(`Task ${id} is ${task.stage}; only a launched task can be completed after verification`);
169
+ Object.assign(task, { stage: 'complete', verification: text(verification, 'verification', 2000), waiting: false, updatedAt: Date.now() });
170
+ this.save(sessionId);
171
+ return task;
172
+ }
173
+ reopen(sessionId, id, reason, child) {
174
+ const task = this.task(sessionId, id);
175
+ if (task.stage === 'pending') throw new Error(`Task ${id} is already pending`);
176
+ const name = this.checkName(sessionId, child === undefined ? task.child : child, task);
177
+ const note = text(reason, 'reason', 2000);
178
+ delete task.subagentId; delete task.verification; delete task.worktree;
179
+ Object.assign(task, { stage: 'pending', child: name, note, waiting: false, updatedAt: Date.now() });
180
+ this.save(sessionId);
181
+ return task;
182
+ }
183
+ /** Remove a task; tasks that depended on it no longer wait for it. */
184
+ drop(sessionId, id) {
185
+ const board = this.load(sessionId);
186
+ const task = this.task(sessionId, id);
187
+ board.tasks.splice(board.tasks.indexOf(task), 1);
188
+ const released = [];
189
+ for (const other of board.tasks) {
190
+ if (!other.dependsOn?.includes(id)) continue;
191
+ other.dependsOn = other.dependsOn.filter(dep => dep !== id);
192
+ released.push(other.id);
193
+ }
194
+ this.save(sessionId);
195
+ return { task, released };
196
+ }
197
+ clear(sessionId) { this.load(sessionId).tasks = []; this.save(sessionId); }
198
+ /** Tasks grouped by column; `status(subagentId)` is the child agent's live status. */
199
+ view(sessionId, status) {
200
+ const columns = Object.fromEntries(COLUMNS.map(column => [column, []]));
201
+ const tasks = this.load(sessionId).tasks;
202
+ const urgent = urgency(tasks);
203
+ for (const task of tasks) {
204
+ const column = task.stage === 'launched' ? (status(task.subagentId) === 'running' || task.waiting ? 'running' : 'verifying') : task.stage;
205
+ columns[column].push({ ...task, priority: task.priority ?? 'normal', column, ...(urgent.has(task.id) ? { urgency: urgent.get(task.id) } : {}), ...(column === 'pending' ? { blockedBy: this.blockers(sessionId, task) } : {}) });
206
+ }
207
+ // Verify what unblocks the most urgent work first, too.
208
+ columns.verifying.sort(order);
209
+ // Pending runs in launch order: ready before blocked, then by effective priority and id.
210
+ columns.pending.sort((a, b) => Number(a.blockedBy.length > 0) - Number(b.blockedBy.length > 0) || order(a, b));
211
+ return columns;
212
+ }
213
+ }
214
+
215
+ /** One-paragraph board state for the coordinator's next step; empty when nothing is open. */
216
+ export function boardSummary(columns, { running, limit }) {
217
+ const open = columns.pending.length + columns.running.length + columns.verifying.length;
218
+ if (!open) return '';
219
+ const all = COLUMNS.flatMap(column => columns[column]);
220
+ const byId = new Map(all.map(task => [task.id, task]));
221
+ const inherited = task => task.urgency !== undefined && task.urgency < PRIORITIES.indexOf(task.priority ?? 'normal');
222
+ const name = task => `${task.id} /${task.child}${task.priority && task.priority !== 'normal' ? ` [${task.priority}]` : ''}${inherited(task) ? ` [${PRIORITIES[task.urgency]} via its dependents]` : ''}`;
223
+ const list = tasks => tasks.map(task => `${name(task)}${task.waiting ? ' (asked you a question)' : ''}`).join(', ') || 'none';
224
+ const ready = columns.pending.filter(task => !task.blockedBy?.length);
225
+ const blocked = columns.pending.filter(task => task.blockedBy?.length);
226
+ const free = Math.max(0, limit - running);
227
+ // A ready task with dependencies starts from their verified changes: name where they are.
228
+ const inputs = ready.filter(task => task.dependsOn?.length).map(task => `${task.id} builds on ${task.dependsOn.map(id => `${id} (${byId.get(id)?.worktree ?? 'worktree unknown'})`).join(', ')}`);
229
+ const parts = [
230
+ `Delegate board. Ready to launch, in order: ${list(ready)}.`,
231
+ blocked.length ? ` Blocked: ${blocked.map(task => `${name(task)} waits on ${task.blockedBy.join(', ')}`).join('; ')}.` : '',
232
+ ` Running: ${list(columns.running)}. Verifying: ${list(columns.verifying)}. Complete: ${columns.complete.length}.`,
233
+ ` Child slots: ${running} of ${limit} running, ${free} free.`,
234
+ ready.length && free ? ` Launch the first ${Math.min(free, ready.length)} ready ${Math.min(free, ready.length) === 1 ? 'task' : 'tasks'} now, in the order above, each with subagent named as planned and worktree: true.` : '',
235
+ inputs.length ? ` ${inputs.join('; ')}: tell each such child to bring those changes in first, as the protocol describes.` : '',
236
+ !ready.length && blocked.length && !columns.running.length && !columns.verifying.length ? ' Every pending task is blocked and nothing is in flight: fix the plan with delegate_board update or drop.' : '',
237
+ columns.verifying.length ? ' Verify each verifying task in its worktree, then record the outcome with delegate_board complete (with the evidence) or reopen, or send the child fixes. Verify tasks that others depend on first.' : '',
238
+ columns.running.some(task => task.waiting) ? ' Answer the children waiting on you.' : '',
239
+ ];
240
+ return parts.join('');
241
+ }
242
+
243
+ // Readers share the owning policy's live board, including its cache. Sources
244
+ // belong to their policy scope, which may be a standing preset or one Agent.
245
+ const sources = new Map();
246
+ export function setBoardSource(next, scope) {
247
+ sources.set(scope, next);
248
+ return () => { if (sources.get(scope) === next) sources.delete(scope); };
249
+ }
250
+ /** `{ columns, running, limit }` for a root session, or undefined when no board source is mounted. */
251
+ export function delegateBoardFor(sessionId, scope) {
252
+ if (scope !== undefined) {
253
+ for (const owner of scopeChainOf(scope)) if (sources.has(owner)) return sources.get(owner)(sessionId);
254
+ return sources.get(undefined)?.(sessionId);
255
+ }
256
+ for (const [owner, read] of sources) {
257
+ if (owner?.session?.id !== undefined && owner.session.id !== sessionId) continue;
258
+ const value = read(sessionId); if (value) return value;
259
+ }
260
+ }
@@ -0,0 +1,11 @@
1
+ const targets = new Map();
2
+
3
+ /** Keep name resolution out of the runtime's immutable tool-call arguments. */
4
+ export async function withChildTarget(exec, target, next) {
5
+ const key = exec.token ?? exec;
6
+ targets.set(key, target);
7
+ try { return await next(); }
8
+ finally { targets.delete(key); }
9
+ }
10
+
11
+ export function childTarget(exec) { return targets.get(exec.token ?? exec) ?? exec.arguments.agent_id; }
@@ -0,0 +1,17 @@
1
+ import { apply as nativeControl } from '@deepseek-ai/dsh-tool-subagent-control';
2
+ import { childTarget } from './child-target.mjs';
3
+
4
+ export const inject = ['tools', 'subagents'];
5
+ export function apply(ctx) {
6
+ nativeControl({ subagents: ctx.subagents, tools: { register(tool) {
7
+ const execute = tool.execute;
8
+ // Retain the native definition identity, including its non-enumerable
9
+ // adjacent-agent messaging marker and its result schema/presentation.
10
+ tool.execute = (args, exec) => {
11
+ const target = childTarget(exec);
12
+ if (typeof target === 'string' && target.startsWith('/')) throw Error('The DSCODE child-name policy is unavailable for this call.');
13
+ return execute({ ...args, agent_id: target }, exec);
14
+ };
15
+ return ctx.tools.register(tool);
16
+ } } });
17
+ }
@@ -0,0 +1,55 @@
1
+ globalThis.__ModuleLoader__.load({
2
+ id: '@toddzheng024/dscode-desktop',
3
+ factory: require => {
4
+ const { createElement: h, useState, useEffect, useRef } = require('react');
5
+ const columns = [['pending', 'Pending'], ['running', 'Running'], ['verifying', 'Verifying'], ['complete', 'Complete']];
6
+ const control = { padding: '7px 10px', border: '1px solid #8886', borderRadius: 6, background: 'transparent', color: 'inherit', font: 'inherit' };
7
+ function Board({ execute }) {
8
+ const [state, setState] = useState(null), [error, setError] = useState('');
9
+ const active = useRef(false), alive = useRef(true);
10
+ const refresh = async () => {
11
+ if (active.current) return; active.current = true;
12
+ try { const next = await execute(); if (alive.current) { setState(next); setError(''); } }
13
+ catch (error) { if (alive.current) { setState(null); setError(error.message); } }
14
+ finally { active.current = false; }
15
+ };
16
+ useEffect(() => { alive.current = true; void refresh(); const timer = setInterval(refresh, 1000);
17
+ return () => { alive.current = false; clearInterval(timer); }; }, []);
18
+ const card = (task, column) => h('li', { key: task.id, style: { listStyle: 'none', border: '1px solid #8885', borderRadius: 6, padding: 10, marginTop: 8, overflowWrap: 'anywhere' } },
19
+ h('strong', null, `${task.id} · ${task.title}`),
20
+ h('p', { style: { margin: '6px 0', fontSize: 12 } }, `/${task.child} · ${task.priority} priority`),
21
+ task.waiting && h('p', null, 'Waiting for the coordinator’s answer'),
22
+ task.blockedBy.length > 0 ? h('p', null, `Blocked by ${task.blockedBy.join(', ')}`) : column === 'pending' && h('p', null, 'Ready to launch'),
23
+ column === 'verifying' && h('p', null, 'Awaiting coordinator verification'),
24
+ task.dependsOn.length > 0 && h('p', { style: { fontSize: 12 } }, `Depends on ${task.dependsOn.join(', ')}`),
25
+ (task.detail || task.note || task.verification || task.worktree) && h('details', null, h('summary', null, 'Task details'),
26
+ ...[['Scope and checks', task.detail], ['Reopened because', task.note], ['Verification evidence', task.verification], ['Worktree', task.worktree]]
27
+ .filter(([, value]) => value).map(([label, value]) => h('div', { key: label, style: { marginTop: 8 } }, h('strong', null, label), h('p', { style: { whiteSpace: 'pre-wrap', margin: '4px 0' } }, value)))));
28
+ return h('section', { 'aria-label': 'DSCODE delegation board', style: { padding: 16, height: '100%', overflow: 'auto', boxSizing: 'border-box' } },
29
+ h('h2', { style: { marginTop: 0 } }, 'Delegation board'),
30
+ h('p', { style: { fontSize: 12 } }, 'Use /delegate <task> in the main session to coordinate work in isolated Git worktrees. The coordinator plans tasks and records verified results.'),
31
+ h('button', { type: 'button', style: control, onClick: refresh }, 'Refresh board'),
32
+ error && h('p', { role: 'alert' }, error),
33
+ !state && !error && h('p', { role: 'status' }, 'Loading delegation board…'),
34
+ state && h('div', null,
35
+ h('p', { role: 'status' }, `${state.running} of ${state.limit} child slots running`),
36
+ !columns.some(([key]) => state.columns[key].length) && h('p', null, 'No delegated tasks yet.'),
37
+ h('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))', gap: 12 } },
38
+ ...columns.map(([key, label]) => h('section', { key, 'aria-label': label }, h('h3', null, `${label} (${state.columns[key].length})`),
39
+ state.columns[key].length ? h('ul', { style: { padding: 0, margin: 0 } }, ...state.columns[key].map(task => card(task, key))) : h('p', { style: { fontSize: 12 } }, 'None')))),
40
+ h('p', { style: { fontSize: 12 } }, 'Refreshes once per second while visible. Reading the board does not launch children, change tasks or merge work.')));
41
+ }
42
+ function BoardPane({ sessionId, execute, useTabInfo }) { const { tab } = useTabInfo(); return tab.visible ? h(Board, { key: sessionId, execute }) : null; }
43
+ const id = '@toddzheng024/dscode-delegation-desktop';
44
+ return { inject: ['slots', 'sidebarRightTabs', 'connection'], apply(ctx) {
45
+ ctx.effect(() => ctx.sidebarRightTabs.register({ id, kind: 'dscode-delegation', multiple: false, title: () => 'Delegation board',
46
+ guide: [{ id: 'open', order: 34, title: () => 'Delegation board', description: () => 'Follow DSCODE delegated tasks, dependencies and verification.' }] }), 'dscode-delegation.type');
47
+ ctx.effect(() => ctx.slots.inject('sidebar.right.pane.tab', () => ctx.slots.register({ name: 'sidebar.right.pane.tab', key: id,
48
+ inject: sessionId => ({ sessionId, execute: async () => {
49
+ const response = await ctx.connection.rpc.call('/api', 'dscode-delegation', { action: 'status', sessionId });
50
+ if (!response.ok) throw Error(response.error.message); return response.value;
51
+ } }),
52
+ }, BoardPane)), 'dscode-delegation.body');
53
+ } };
54
+ },
55
+ });
@@ -0,0 +1,37 @@
1
+ import { clientRequestSchema } from '@deepseek-ai/dsh-client-connection';
2
+ import { scopeOf } from '@deepseek-ai/dsh-scope';
3
+ import { COLUMNS, delegateBoardFor } from './board.mjs';
4
+
5
+ export function desktopBoardRequest(ctx, payload) {
6
+ if (payload?.action !== 'status' || typeof payload.sessionId !== 'string') throw Error('Choose a DSCODE main session to view its delegation board.');
7
+ const agent = ctx.agents.get(payload.sessionId);
8
+ if (!agent || ctx.agentPresets.composedPreset(agent.ctx) !== 'dscode' || agent.session.header.origin === 'subagent') {
9
+ throw Error('The delegation board is available for an open DSCODE main session.');
10
+ }
11
+ const board = delegateBoardFor(agent.id, scopeOf(agent.ctx));
12
+ if (!board) throw Error('The delegation policy is unavailable for this session.');
13
+ return { sessionId: agent.id, running: board.running, limit: board.limit,
14
+ columns: Object.fromEntries(COLUMNS.map(column => [column, board.columns[column].map(task => ({
15
+ id: task.id, title: task.title, child: task.child, priority: task.priority,
16
+ dependsOn: task.dependsOn ?? [], blockedBy: task.blockedBy ?? [], waiting: task.waiting === true,
17
+ detail: task.detail ?? '', note: task.note ?? '', verification: task.verification ?? '', worktree: task.worktree ?? '',
18
+ }))])),
19
+ };
20
+ }
21
+
22
+ export const inject = ['agents', 'agentPresets', 'connection'];
23
+ export function apply(ctx) {
24
+ ctx.effect(() => ctx.connection.fetch.register({ path: '/api/dscode-delegation', methods: ['POST'], requestBody: 'buffered',
25
+ fetch: async request => {
26
+ let body;
27
+ try { body = await request.json(); } catch { return new Response('Invalid JSON', { status: 400 }); }
28
+ const parsed = clientRequestSchema.safeParse(body);
29
+ if (!parsed.success || parsed.data.method !== 'dscode-delegation') return new Response('Invalid delegation request', { status: 400 });
30
+ const { rpcId, payload } = parsed.data;
31
+ let result;
32
+ try { result = { ok: true, value: desktopBoardRequest(ctx, payload) }; }
33
+ catch (error) { result = { ok: false, error: { code: 'dscode-delegation', message: error.message, details: {} } }; }
34
+ return Response.json({ type: 'server-response', rpcId, result }, { headers: { 'Cache-Control': 'no-store' } });
35
+ },
36
+ }), 'dscode delegation rpc');
37
+ }