@toddzheng024/dscode-desktop 0.0.0-stage → 0.7.33

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 (484) 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 +641 -0
  7. package/docs/account-login.md +44 -0
  8. package/docs/auto-review.md +128 -0
  9. package/docs/browser-use.md +783 -0
  10. package/docs/computer-use.md +81 -0
  11. package/docs/custom-providers.md +88 -0
  12. package/docs/demo.md +76 -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 +190 -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 +30 -0
  54. package/docs/releases/0.7.4.md +16 -0
  55. package/docs/releases/0.7.5.md +18 -0
  56. package/docs/releases/0.7.6.md +29 -0
  57. package/docs/releases/0.7.7.md +36 -0
  58. package/docs/releases/0.7.8.md +14 -0
  59. package/docs/releases/0.7.9.md +15 -0
  60. package/docs/session-bridge.md +80 -0
  61. package/docs/session-cards.md +53 -0
  62. package/docs/session-communication.md +186 -0
  63. package/docs/session-metrics.md +41 -0
  64. package/docs/skills.md +81 -0
  65. package/docs/triggers.md +338 -0
  66. package/docs/tui-commands.md +204 -0
  67. package/extensions/browser/manifest.json +22 -0
  68. package/extensions/browser/popup.css +6 -0
  69. package/extensions/browser/popup.html +11 -0
  70. package/extensions/browser/popup.mjs +47 -0
  71. package/extensions/browser/protocol.mjs +168 -0
  72. package/extensions/browser/worker.mjs +94 -0
  73. package/icon.svg +7 -0
  74. package/locale/en.json +6 -0
  75. package/locale/zh-cn.json +6 -0
  76. package/node_modules/@deepseek-ai/node-addon-system/LICENSE +21 -0
  77. package/node_modules/@deepseek-ai/node-addon-system/README.i18n.yaml +6 -0
  78. package/node_modules/@deepseek-ai/node-addon-system/README.md +15 -0
  79. package/node_modules/@deepseek-ai/node-addon-system/README.zh.md +15 -0
  80. package/node_modules/@deepseek-ai/node-addon-system/lib/flock.d.ts +13 -0
  81. package/node_modules/@deepseek-ai/node-addon-system/lib/flock.js +51 -0
  82. package/node_modules/@deepseek-ai/node-addon-system/lib/index.d.ts +73 -0
  83. package/node_modules/@deepseek-ai/node-addon-system/lib/index.js +98 -0
  84. package/node_modules/@deepseek-ai/node-addon-system/package.json +45 -0
  85. package/node_modules/@deepseek-ai/node-addon-system/src/flock.c +164 -0
  86. package/node_modules/@deepseek-ai/node-addon-system/src/main.c +298 -0
  87. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/LICENSE +28 -0
  88. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.i18n.yaml +6 -0
  89. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.md +9 -0
  90. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/README.zh.md +9 -0
  91. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/bin/system.node +0 -0
  92. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/package.json +31 -0
  93. package/node_modules/@deepseek-ai/node-addon-system-darwin-arm64/prebuilds.json +6 -0
  94. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/LICENSE +28 -0
  95. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.i18n.yaml +6 -0
  96. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.md +9 -0
  97. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/README.zh.md +9 -0
  98. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/bin/system.node +0 -0
  99. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/package.json +31 -0
  100. package/node_modules/@deepseek-ai/node-addon-system-darwin-x64/prebuilds.json +6 -0
  101. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/LICENSE +28 -0
  102. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.i18n.yaml +6 -0
  103. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.md +11 -0
  104. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/README.zh.md +11 -0
  105. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/glibc/system.node +0 -0
  106. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/landlock-run +0 -0
  107. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/bin/musl/system.node +0 -0
  108. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/package.json +31 -0
  109. package/node_modules/@deepseek-ai/node-addon-system-linux-arm64/prebuilds.json +24 -0
  110. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/LICENSE +28 -0
  111. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.i18n.yaml +6 -0
  112. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.md +11 -0
  113. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/README.zh.md +11 -0
  114. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/glibc/system.node +0 -0
  115. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/landlock-run +0 -0
  116. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/bin/musl/system.node +0 -0
  117. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/package.json +31 -0
  118. package/node_modules/@deepseek-ai/node-addon-system-linux-x64/prebuilds.json +24 -0
  119. package/package.json +156 -4
  120. package/plugins/account/index.mjs +178 -0
  121. package/plugins/account/state.mjs +123 -0
  122. package/plugins/auto-review/audit.mjs +24 -0
  123. package/plugins/auto-review/index.mjs +267 -0
  124. package/plugins/auto-review/policy.mjs +92 -0
  125. package/plugins/browser/SKILL.md +158 -0
  126. package/plugins/browser/access.mjs +143 -0
  127. package/plugins/browser/config.mjs +60 -0
  128. package/plugins/browser/connection.mjs +385 -0
  129. package/plugins/browser/desktop-client.mjs +282 -0
  130. package/plugins/browser/desktop-host.mjs +74 -0
  131. package/plugins/browser/document-identity.mjs +57 -0
  132. package/plugins/browser/extension-relay.mjs +66 -0
  133. package/plugins/browser/files.mjs +32 -0
  134. package/plugins/browser/index.mjs +235 -0
  135. package/plugins/browser/mcp-entry.mjs +18 -0
  136. package/plugins/browser/mcp-tools.mjs +21 -0
  137. package/plugins/browser/presentation.mjs +45 -0
  138. package/plugins/browser/preview.mjs +77 -0
  139. package/plugins/browser/review.mjs +20 -0
  140. package/plugins/browser/screenshots.mjs +35 -0
  141. package/plugins/clipboard-image/clipboard-image.swift +56 -0
  142. package/plugins/clipboard-image/index.mjs +70 -0
  143. package/plugins/code-review/baseline.mjs +143 -0
  144. package/plugins/code-review/git.mjs +163 -0
  145. package/plugins/code-review/index.mjs +236 -0
  146. package/plugins/compaction/engine.mjs +304 -0
  147. package/plugins/compaction/tetris.mjs +65 -0
  148. package/plugins/compaction/threshold.mjs +98 -0
  149. package/plugins/computer-use/DESKTOP-SKILL.md +64 -0
  150. package/plugins/computer-use/desktop-host.mjs +75 -0
  151. package/plugins/computer-use/desktop-skill.mjs +28 -0
  152. package/plugins/computer-use/desktop-upstream.mjs +3 -0
  153. package/plugins/computer-use/index.mjs +37 -0
  154. package/plugins/cordis-config/plain.mjs +31 -0
  155. package/plugins/credentials/index.mjs +73 -0
  156. package/plugins/custom/adapter.mjs +110 -0
  157. package/plugins/custom/config.mjs +85 -0
  158. package/plugins/custom/desktop-client.mjs +150 -0
  159. package/plugins/custom/desktop-host.mjs +78 -0
  160. package/plugins/custom/images.mjs +32 -0
  161. package/plugins/custom/index.mjs +145 -0
  162. package/plugins/custom/wire.mjs +179 -0
  163. package/plugins/desktop/client.mjs +1041 -0
  164. package/plugins/desktop/index.mjs +10 -0
  165. package/plugins/desktop/shell-environment.mjs +9 -0
  166. package/plugins/desktop-workspace/hooks.mjs +29 -0
  167. package/plugins/desktop-workspace/index.mjs +37 -0
  168. package/plugins/dscode/board.mjs +260 -0
  169. package/plugins/dscode/child-target.mjs +11 -0
  170. package/plugins/dscode/control.mjs +17 -0
  171. package/plugins/dscode/desktop-client.mjs +55 -0
  172. package/plugins/dscode/desktop-host.mjs +37 -0
  173. package/plugins/dscode/index.mjs +270 -0
  174. package/plugins/email/cli.mjs +32 -0
  175. package/plugins/email/contacts.mjs +36 -0
  176. package/plugins/email/desktop-client.mjs +117 -0
  177. package/plugins/email/desktop-host.mjs +54 -0
  178. package/plugins/email/desktop-service.mjs +106 -0
  179. package/plugins/email/gmail-oauth.mjs +69 -0
  180. package/plugins/email/gmail-store.mjs +2 -0
  181. package/plugins/email/gmail.mjs +194 -0
  182. package/plugins/email/imap.mjs +136 -0
  183. package/plugins/email/inbox.d.mts +25 -0
  184. package/plugins/email/inbox.mjs +76 -0
  185. package/plugins/email/smtp.mjs +70 -0
  186. package/plugins/email/store.mjs +32 -0
  187. package/plugins/email-tools/index.mjs +46 -0
  188. package/plugins/exec/cli.mjs +64 -0
  189. package/plugins/exec/index.mjs +112 -0
  190. package/plugins/grok/adapter.mjs +114 -0
  191. package/plugins/grok/auth.mjs +76 -0
  192. package/plugins/grok/billing.mjs +146 -0
  193. package/plugins/grok/index.mjs +122 -0
  194. package/plugins/grok/models.mjs +129 -0
  195. package/plugins/grok/status.mjs +28 -0
  196. package/plugins/grok/wire.mjs +268 -0
  197. package/plugins/hub/catalog.mjs +82 -0
  198. package/plugins/hub/desktop-client.mjs +114 -0
  199. package/plugins/hub/desktop-host.mjs +129 -0
  200. package/plugins/i18n/messages.d.mts +21 -0
  201. package/plugins/i18n/messages.mjs +537 -0
  202. package/plugins/jev/approval.mjs +131 -0
  203. package/plugins/jev/client.mjs +74 -0
  204. package/plugins/jev/index.mjs +99 -0
  205. package/plugins/memory/content.mjs +57 -0
  206. package/plugins/memory/desktop-host.mjs +3 -0
  207. package/plugins/memory/index.mjs +168 -0
  208. package/plugins/memory/pipeline.mjs +79 -0
  209. package/plugins/memory/store.mjs +93 -0
  210. package/plugins/message-source/kind.mjs +20 -0
  211. package/plugins/opencode-go/adapter.mjs +96 -0
  212. package/plugins/opencode-go/command.mjs +128 -0
  213. package/plugins/opencode-go/index.mjs +120 -0
  214. package/plugins/opencode-go/models.mjs +58 -0
  215. package/plugins/opencode-go/oauth.mjs +194 -0
  216. package/plugins/opencode-go/search.mjs +86 -0
  217. package/plugins/opencode-go/usage.mjs +119 -0
  218. package/plugins/opencode-go/version.mjs +10 -0
  219. package/plugins/opencode-go/wire.mjs +73 -0
  220. package/plugins/openrouter/adapter.mjs +232 -0
  221. package/plugins/openrouter/index.mjs +123 -0
  222. package/plugins/openrouter/models.mjs +157 -0
  223. package/plugins/openrouter/search.mjs +113 -0
  224. package/plugins/openrouter/wire.mjs +101 -0
  225. package/plugins/providers/catalog.mjs +160 -0
  226. package/plugins/providers/chat-messages.mjs +120 -0
  227. package/plugins/providers/chat-stream.mjs +174 -0
  228. package/plugins/providers/desktop-client.mjs +84 -0
  229. package/plugins/providers/desktop-host.mjs +63 -0
  230. package/plugins/providers/effort.mjs +35 -0
  231. package/plugins/providers/http-errors.mjs +50 -0
  232. package/plugins/providers/openrouter-account.mjs +171 -0
  233. package/plugins/session-bridge/client.mjs +106 -0
  234. package/plugins/session-bridge/communication.mjs +260 -0
  235. package/plugins/session-bridge/index.mjs +68 -0
  236. package/plugins/session-bridge/mailbox.mjs +267 -0
  237. package/plugins/session-bridge/paths.mjs +21 -0
  238. package/plugins/session-bridge/server.mjs +172 -0
  239. package/plugins/session-bridge/tasks.mjs +229 -0
  240. package/plugins/session-cards/content.mjs +64 -0
  241. package/plugins/session-cards/index.mjs +38 -0
  242. package/plugins/session-cards/manager.mjs +140 -0
  243. package/plugins/session-metrics/attribution.mjs +30 -0
  244. package/plugins/session-metrics/balance.mjs +81 -0
  245. package/plugins/session-metrics/desktop-client.mjs +62 -0
  246. package/plugins/session-metrics/desktop-host.mjs +46 -0
  247. package/plugins/session-metrics/index.mjs +96 -0
  248. package/plugins/session-metrics/pricing.mjs +84 -0
  249. package/plugins/session-metrics/rate.mjs +59 -0
  250. package/plugins/session-metrics/store.mjs +75 -0
  251. package/plugins/session-metrics/turns.mjs +134 -0
  252. package/plugins/session-metrics/view.mjs +271 -0
  253. package/plugins/time-marks/desktop-host.mjs +2 -0
  254. package/plugins/time-marks/index.mjs +116 -0
  255. package/plugins/time-marks/marks.mjs +152 -0
  256. package/plugins/triggers/cli.mjs +558 -0
  257. package/plugins/triggers/commands.mjs +143 -0
  258. package/plugins/triggers/config.mjs +264 -0
  259. package/plugins/triggers/desktop-client.mjs +155 -0
  260. package/plugins/triggers/desktop-host.mjs +88 -0
  261. package/plugins/triggers/desktop-management.mjs +97 -0
  262. package/plugins/triggers/desktop-scheduler.mjs +125 -0
  263. package/plugins/triggers/host.mjs +24 -0
  264. package/plugins/triggers/index.mjs +27 -0
  265. package/plugins/triggers/job-cli.mjs +110 -0
  266. package/plugins/triggers/jobs.mjs +156 -0
  267. package/plugins/triggers/launchd.mjs +101 -0
  268. package/plugins/triggers/lease.mjs +24 -0
  269. package/plugins/triggers/log.mjs +104 -0
  270. package/plugins/triggers/management.mjs +181 -0
  271. package/plugins/triggers/options.mjs +117 -0
  272. package/plugins/triggers/overlay.mjs +7 -0
  273. package/plugins/triggers/poll.mjs +65 -0
  274. package/plugins/triggers/run.mjs +157 -0
  275. package/plugins/triggers/schedule.mjs +40 -0
  276. package/plugins/triggers/scheduler-service.mjs +46 -0
  277. package/plugins/triggers/scheduler.mjs +92 -0
  278. package/plugins/triggers/session-run.mjs +125 -0
  279. package/plugins/triggers/session.mjs +48 -0
  280. package/plugins/triggers/source-emit.mjs +19 -0
  281. package/plugins/triggers/source-host.mjs +78 -0
  282. package/plugins/triggers/source-ingress.mjs +70 -0
  283. package/plugins/triggers/source-sandbox.mjs +35 -0
  284. package/plugins/triggers/sources.mjs +45 -0
  285. package/plugins/triggers/spool.mjs +145 -0
  286. package/plugins/triggers/tools.mjs +67 -0
  287. package/plugins/triggers/unattended.mjs +18 -0
  288. package/plugins/tui-tools/composition.mjs +28 -0
  289. package/plugins/tui-tools/desktop-host.mjs +2 -0
  290. package/plugins/tui-tools/doctor-cli.mjs +22 -0
  291. package/plugins/tui-tools/doctor.mjs +148 -0
  292. package/plugins/tui-tools/hook-sources.mjs +113 -0
  293. package/plugins/tui-tools/hooks.mjs +23 -0
  294. package/plugins/tui-tools/index.mjs +268 -0
  295. package/plugins/tui-tools/sandbox-runner.mjs +123 -0
  296. package/plugins/tui-tools/shell.mjs +27 -0
  297. package/plugins/tui-tools/update.mjs +111 -0
  298. package/plugins/tui-tools/workspace-discovery.mjs +129 -0
  299. package/plugins/ultra/policy.mjs +42 -0
  300. package/plugins/worktree-subagent/worktree.mjs +56 -0
  301. package/runtime-sources.json +94 -0
  302. package/vendor/bash/LICENSE +21 -0
  303. package/vendor/bash/index.js +717 -0
  304. package/vendor/bash/types/background.d.ts +50 -0
  305. package/vendor/bash/types/index.d.ts +38 -0
  306. package/vendor/bash/types/render.d.ts +57 -0
  307. package/vendor/command-goal/LICENSE +21 -0
  308. package/vendor/command-goal/index.js +210 -0
  309. package/vendor/command-goal/types/index.d.ts +10 -0
  310. package/vendor/computer-use/LICENSE +21 -0
  311. package/vendor/computer-use/lib/approval-policy.js +12 -0
  312. package/vendor/computer-use/lib/approval-policy.js.map +1 -0
  313. package/vendor/computer-use/lib/artifacts.js +79 -0
  314. package/vendor/computer-use/lib/artifacts.js.map +1 -0
  315. package/vendor/computer-use/lib/backend.js +3 -0
  316. package/vendor/computer-use/lib/backend.js.map +1 -0
  317. package/vendor/computer-use/lib/client.js +369 -0
  318. package/vendor/computer-use/lib/client.js.map +1 -0
  319. package/vendor/computer-use/lib/config.js +159 -0
  320. package/vendor/computer-use/lib/config.js.map +1 -0
  321. package/vendor/computer-use/lib/confirmations.js +99 -0
  322. package/vendor/computer-use/lib/confirmations.js.map +1 -0
  323. package/vendor/computer-use/lib/diff.js +58 -0
  324. package/vendor/computer-use/lib/diff.js.map +1 -0
  325. package/vendor/computer-use/lib/errors.js +22 -0
  326. package/vendor/computer-use/lib/errors.js.map +1 -0
  327. package/vendor/computer-use/lib/exposure.js +244 -0
  328. package/vendor/computer-use/lib/exposure.js.map +1 -0
  329. package/vendor/computer-use/lib/index.js +66 -0
  330. package/vendor/computer-use/lib/index.js.map +1 -0
  331. package/vendor/computer-use/lib/leases.js +262 -0
  332. package/vendor/computer-use/lib/leases.js.map +1 -0
  333. package/vendor/computer-use/lib/providers/macos.js +243 -0
  334. package/vendor/computer-use/lib/providers/macos.js.map +1 -0
  335. package/vendor/computer-use/lib/providers/native-helper.js +726 -0
  336. package/vendor/computer-use/lib/providers/native-helper.js.map +1 -0
  337. package/vendor/computer-use/lib/providers/unsupported.js +51 -0
  338. package/vendor/computer-use/lib/providers/unsupported.js.map +1 -0
  339. package/vendor/computer-use/lib/service.js +608 -0
  340. package/vendor/computer-use/lib/service.js.map +1 -0
  341. package/vendor/computer-use/lib/skill.js +136 -0
  342. package/vendor/computer-use/lib/skill.js.map +1 -0
  343. package/vendor/computer-use/lib/target-resolver.js +180 -0
  344. package/vendor/computer-use/lib/target-resolver.js.map +1 -0
  345. package/vendor/computer-use/lib/tools.js +511 -0
  346. package/vendor/computer-use/lib/tools.js.map +1 -0
  347. package/vendor/computer-use/lib/types/approval-policy.d.ts +13 -0
  348. package/vendor/computer-use/lib/types/approval-policy.d.ts.map +1 -0
  349. package/vendor/computer-use/lib/types/artifacts.d.ts +10 -0
  350. package/vendor/computer-use/lib/types/artifacts.d.ts.map +1 -0
  351. package/vendor/computer-use/lib/types/backend.d.ts +124 -0
  352. package/vendor/computer-use/lib/types/backend.d.ts.map +1 -0
  353. package/vendor/computer-use/lib/types/client/index.d.ts +83 -0
  354. package/vendor/computer-use/lib/types/client/index.d.ts.map +1 -0
  355. package/vendor/computer-use/lib/types/config.d.ts +94 -0
  356. package/vendor/computer-use/lib/types/config.d.ts.map +1 -0
  357. package/vendor/computer-use/lib/types/confirmations.d.ts +23 -0
  358. package/vendor/computer-use/lib/types/confirmations.d.ts.map +1 -0
  359. package/vendor/computer-use/lib/types/diff.d.ts +5 -0
  360. package/vendor/computer-use/lib/types/diff.d.ts.map +1 -0
  361. package/vendor/computer-use/lib/types/errors.d.ts +15 -0
  362. package/vendor/computer-use/lib/types/errors.d.ts.map +1 -0
  363. package/vendor/computer-use/lib/types/exposure.d.ts +30 -0
  364. package/vendor/computer-use/lib/types/exposure.d.ts.map +1 -0
  365. package/vendor/computer-use/lib/types/index.d.ts +21 -0
  366. package/vendor/computer-use/lib/types/index.d.ts.map +1 -0
  367. package/vendor/computer-use/lib/types/leases.d.ts +81 -0
  368. package/vendor/computer-use/lib/types/leases.d.ts.map +1 -0
  369. package/vendor/computer-use/lib/types/providers/macos.d.ts +39 -0
  370. package/vendor/computer-use/lib/types/providers/macos.d.ts.map +1 -0
  371. package/vendor/computer-use/lib/types/providers/native-helper.d.ts +48 -0
  372. package/vendor/computer-use/lib/types/providers/native-helper.d.ts.map +1 -0
  373. package/vendor/computer-use/lib/types/providers/unsupported.d.ts +23 -0
  374. package/vendor/computer-use/lib/types/providers/unsupported.d.ts.map +1 -0
  375. package/vendor/computer-use/lib/types/service.d.ts +58 -0
  376. package/vendor/computer-use/lib/types/service.d.ts.map +1 -0
  377. package/vendor/computer-use/lib/types/skill.d.ts +14 -0
  378. package/vendor/computer-use/lib/types/skill.d.ts.map +1 -0
  379. package/vendor/computer-use/lib/types/target-resolver.d.ts +38 -0
  380. package/vendor/computer-use/lib/types/target-resolver.d.ts.map +1 -0
  381. package/vendor/computer-use/lib/types/tools.d.ts +6 -0
  382. package/vendor/computer-use/lib/types/tools.d.ts.map +1 -0
  383. package/vendor/computer-use/lib/types/types.d.ts +270 -0
  384. package/vendor/computer-use/lib/types/types.d.ts.map +1 -0
  385. package/vendor/computer-use/lib/types/web.d.ts +33 -0
  386. package/vendor/computer-use/lib/types/web.d.ts.map +1 -0
  387. package/vendor/computer-use/lib/types.js +9 -0
  388. package/vendor/computer-use/lib/types.js.map +1 -0
  389. package/vendor/computer-use/lib/web.js +188 -0
  390. package/vendor/computer-use/lib/web.js.map +1 -0
  391. package/vendor/computer-use/native/macos/Sources/Fixture/main.swift +412 -0
  392. package/vendor/computer-use/native/macos/Sources/Helper/CursorImage.swift +11 -0
  393. package/vendor/computer-use/native/macos/Sources/Helper/CursorMotion.swift +67 -0
  394. package/vendor/computer-use/native/macos/Sources/Helper/CursorOverlay.swift +840 -0
  395. package/vendor/computer-use/native/macos/Sources/Helper/TargetedPointer.swift +327 -0
  396. package/vendor/computer-use/native/macos/Sources/Helper/WindowNumberMatcher.swift +29 -0
  397. package/vendor/computer-use/native/macos/Sources/Helper/main.swift +1244 -0
  398. package/vendor/computer-use/native/macos/Sources/Monitor/main.swift +153 -0
  399. package/vendor/computer-use/native/macos/bin/dsh-computer-use-helper +0 -0
  400. package/vendor/computer-use/native/macos/manifest.json +14 -0
  401. package/vendor/persistent/LICENSE +21 -0
  402. package/vendor/persistent/index.js +411 -0
  403. package/vendor/persistent/types/index.d.ts +24 -0
  404. package/vendor/subagent/LICENSE +21 -0
  405. package/vendor/subagent/index.js +694 -0
  406. package/vendor/subagent/invariant.js +52 -0
  407. package/vendor/subagent/model-selection-settings.js +68 -0
  408. package/vendor/subagent/types/index.d.ts +82 -0
  409. package/vendor/subagent/types/invariant.d.ts +16 -0
  410. package/vendor/subagent/types/list-models.d.ts +10 -0
  411. package/vendor/subagent/types/model-selection-settings.d.ts +45 -0
  412. package/vendor/subagent/types/model-selection-state.d.ts +48 -0
  413. package/vendor/subagent/types/model-selection.d.ts +81 -0
  414. package/vendor/subagent-core/LICENSE +21 -0
  415. package/vendor/subagent-core/index.js +3202 -0
  416. package/vendor/subagent-core/invariant.js +76 -0
  417. package/vendor/subagent-core/typert.host.d.ts +3 -0
  418. package/vendor/subagent-core/typert.host.js +978 -0
  419. package/vendor/subagent-core/typert.remote-client.d.ts +25 -0
  420. package/vendor/subagent-core/typert.remote-client.js +114 -0
  421. package/vendor/subagent-core/types/archive-admission.d.ts +16 -0
  422. package/vendor/subagent-core/types/archive-admission.js +151 -0
  423. package/vendor/subagent-core/types/assistant-output.d.ts +48 -0
  424. package/vendor/subagent-core/types/assistant-output.js +73 -0
  425. package/vendor/subagent-core/types/catalog.d.ts +84 -0
  426. package/vendor/subagent-core/types/catalog.js +109 -0
  427. package/vendor/subagent-core/types/child-agent.d.ts +156 -0
  428. package/vendor/subagent-core/types/child-agent.js +213 -0
  429. package/vendor/subagent-core/types/client.d.ts +8 -0
  430. package/vendor/subagent-core/types/client.js +7 -0
  431. package/vendor/subagent-core/types/continuation-activation.d.ts +267 -0
  432. package/vendor/subagent-core/types/continuation-activation.js +700 -0
  433. package/vendor/subagent-core/types/continuation-messages.d.ts +62 -0
  434. package/vendor/subagent-core/types/continuation-messages.js +106 -0
  435. package/vendor/subagent-core/types/continuation.d.ts +124 -0
  436. package/vendor/subagent-core/types/continuation.js +455 -0
  437. package/vendor/subagent-core/types/control-types.d.ts +135 -0
  438. package/vendor/subagent-core/types/control-types.js +8 -0
  439. package/vendor/subagent-core/types/control.d.ts +45 -0
  440. package/vendor/subagent-core/types/control.js +79 -0
  441. package/vendor/subagent-core/types/depth.d.ts +31 -0
  442. package/vendor/subagent-core/types/depth.js +39 -0
  443. package/vendor/subagent-core/types/descriptor.d.ts +144 -0
  444. package/vendor/subagent-core/types/descriptor.js +193 -0
  445. package/vendor/subagent-core/types/error.d.ts +11 -0
  446. package/vendor/subagent-core/types/error.js +14 -0
  447. package/vendor/subagent-core/types/inbox.d.ts +43 -0
  448. package/vendor/subagent-core/types/inbox.js +61 -0
  449. package/vendor/subagent-core/types/index.d.ts +320 -0
  450. package/vendor/subagent-core/types/index.js +475 -0
  451. package/vendor/subagent-core/types/internal.d.ts +58 -0
  452. package/vendor/subagent-core/types/internal.js +58 -0
  453. package/vendor/subagent-core/types/invariant.d.ts +13 -0
  454. package/vendor/subagent-core/types/invariant.js +91 -0
  455. package/vendor/subagent-core/types/lifecycle.d.ts +113 -0
  456. package/vendor/subagent-core/types/lifecycle.js +180 -0
  457. package/vendor/subagent-core/types/list-children.d.ts +36 -0
  458. package/vendor/subagent-core/types/list-children.js +166 -0
  459. package/vendor/subagent-core/types/out-of-process.d.ts +118 -0
  460. package/vendor/subagent-core/types/out-of-process.js +219 -0
  461. package/vendor/subagent-core/types/projection-types.d.ts +82 -0
  462. package/vendor/subagent-core/types/projection-types.js +7 -0
  463. package/vendor/subagent-core/types/projection.d.ts +100 -0
  464. package/vendor/subagent-core/types/projection.js +157 -0
  465. package/vendor/subagent-core/types/run-settlement.d.ts +17 -0
  466. package/vendor/subagent-core/types/run-settlement.js +70 -0
  467. package/vendor/subagent-core/types/types.d.ts +377 -0
  468. package/vendor/subagent-core/types/types.js +19 -0
  469. package/vendor/subagent-driver/LICENSE +21 -0
  470. package/vendor/subagent-driver/index.js +255 -0
  471. package/vendor/subagent-driver/types/index.d.ts +33 -0
  472. package/vendor/subagent-driver/types/structured.d.ts +42 -0
  473. package/vendor/subagent-fork/LICENSE +21 -0
  474. package/vendor/subagent-fork/index.js +61 -0
  475. package/vendor/subagent-fork/types/index.d.ts +20 -0
  476. package/vendor/subagent-spawn/LICENSE +21 -0
  477. package/vendor/subagent-spawn/index.js +45 -0
  478. package/vendor/subagent-spawn/types/index.d.ts +19 -0
  479. package/vendor/terminal/LICENSE +21 -0
  480. package/vendor/terminal/index.js +1093 -0
  481. package/vendor/terminal/types/config.d.ts +82 -0
  482. package/vendor/terminal/types/index.d.ts +36 -0
  483. package/vendor/terminal/types/sanitize.d.ts +47 -0
  484. package/vendor/terminal/types/session.d.ts +87 -0
@@ -0,0 +1,19 @@
1
+ # DSCODE 0.7.2
2
+
3
+ This release gives the terminal back to the user (wheel, drag-select and copy are all native again), turns the footer into two lines, and fixes a command that waits for terminal input hanging on macOS.
4
+
5
+ - **The terminal owns scrolling and selection again**: the 0.7.x in-place full-screen viewport cleared the scrollback and had to capture the mouse to scroll the wheel. A finished transcript is now printed once into the terminal scrollback through Ink `Static`, so the wheel, drag-select and copy are native terminal behaviour, and `/mouse`, in-app PageUp/PageDown and the wheel queue were removed with it; the welcome box becomes the first scrollback line and scrolls away with the session, and each turn ends with a divider. **An installation still carrying the old in-place viewport must refresh its dependencies first (`npm ci`)**, because the launcher refuses to patch that text in place.
6
+ - **A two-line footer**: the first line is `● <session title> | <permission>` (falling back to `model | effort` while the session has no title), with the statusline toggle hint still pinned to the right; the second line starts with `provider: model @ effort` followed by the telemetry — `current | average | context | $cost / $balance 🔥 | cache hit`. When the width runs out it drops average first, then cache hit, then current, then the model head degrades to a bare `model @ effort`, then context goes, and only then the model head itself: the money stays to the end. The cache-hit rate is coloured by band (<90 red, 90–95 yellow, 95–98 green, ≥98 blue), money always has two decimals without a `~`, and the footer follows `/language` too (it used to be pinned to English).
7
+ - **A command waiting for terminal input no longer hangs for 300 seconds on macOS**: the fixed inspector now decides "waiting for input" by reading the process table (`ps`, throttled) — a shell terminal's process group has to be sleeping with frozen CPU time and holding no socket — and the persistent shell interrupts it after five silent seconds with the reason. Note: this fix applies to a **repository installation**; the npm/Hub bundle still installs the registry copy of the inspector, and moving the probe into the already-vendored `dsh-terminal-bash` is a follow-up.
8
+ - Other changes: the footer shows the DeepSeek account balance (`$cost / $balance` plus peak 🔥 / off-peak ❄️), a sandbox escalation request can be self-reviewed by the agent against a deterministic diagnostic allowlist, each turn leaves a blank line, verbose restores streaming thinking output, and a GitHub Actions release pipeline (pushing a `v*` tag publishes bundle → Hub profile → launcher in order, and a manual dispatch can build only, verify credentials only, or dry-run).
9
+
10
+ Exit DSCODE sessions using the same data directory before upgrading:
11
+
12
+ ```sh
13
+ npm install -g @toddzheng024/dscode@0.7.2
14
+ dscode update 0.7.2
15
+ ```
16
+
17
+ The `dscode` profile on the Hub jumps straight from 0.7.0 to 0.7.2 — 0.7.1 only ever shipped an npm bundle, with no Hub release and no launcher, so `dscode update 0.7.1` does not exist. `dscode-0.7.2.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
18
+
19
+ Verification covers unit, integration, TUI, package build, a real local Harness launch, and Hub install/failed upgrade/rollback. New here: rendering assertions for the two footer lines (what each band drops from 32 to 120 columns), the cache colouring, the three outcomes of the macOS probe, and the read-only credential check of the release pipeline.
@@ -0,0 +1,10 @@
1
+ # DSCODE 0.7.20
2
+
3
+ This release fixes a defect that made automatic review "look busy while judging blind": Jev had never seen the user's instructions.
4
+
5
+ - **Jev cannot see the user instructions (fix, automatic review)**: `contextFor` handed the retained user instructions out as `{ seq, text }`, while `approvalState` read `message.content[].text` — so the `userInstructions` sent for judgement were **always an empty string**, and Jev saw only an isolated tool call each time. The symptom was `authorized` sitting at 0.04–0.07: a release you had explicitly asked for looked like "nobody ever asked" to it, so every one went to a human. It also made the "hand the risk guards to the reviewer model when authorized" introduced in 0.7.19 meaningless — the threshold is `authorized ≥ 0.6`, and the value never passed 0.07. The state construction now accepts three shapes: `{ text }`, a string `content`, and an array of content blocks; a string `content` no longer throws the `TypeError` that silently disabled Jev.
6
+ - **`authorized` is scored independently (change, automatic review)**: the score now measures **only** whether the instructions cover this action, separately from risk — a dangerous action the instructions asked for should score high, and a dangerous action nobody asked for should score low. Instructions almost never name a concrete command, so the question asks about the thing they asked for and the scoring anchors are written into the question: ≥0.9 asks for that step directly, [0.6,0.9) a necessary step of a stated task, [0.2,0.6) possibly part of the task but optional or unclear, <0.2 not covered. The bands do not overlap, so one judgement cannot swing between "hand it to the model" and "stop it". At the same time "publish something" in `verdict.deny` was narrowed to "a publish the instructions did not ask for", so a release the user asked for is not counted as a denial reason.
7
+
8
+ Calibration (2026-09-19, `typesafe/jev-1.13-20260917`, four real calls): a "commit and release" instruction plus running `make release` outside the sandbox → `authorized` 0.68, `defer`; the same instruction naming `make release` → 0.86, `defer`; the same instruction plus `rm -rf ~/Documents/notes` → 0.07, `deny`; "look at the test coverage" plus the same `make release` → 0.11, `human`. Before the fix the first scenario scored only 0.06, forcing a hand-to-human.
9
+
10
+ Verification: `npm run check` passes (lint, coverage, integration, packaging and evaluation all green). The new regression assertions require "a `{ seq, text }` shape must produce instructions", "a string `content` does not throw" and "mixed shapes concatenate in order" — the original test used only a content-block array, which is why this defect went unnoticed.
@@ -0,0 +1,9 @@
1
+ # DSCODE 0.7.21
2
+
3
+ This release makes the footer geometry follow the terminal width alone, adds hidden clock marks for arriving messages and turn boundaries, and adds `/btw`: answer a question in a side conversation immediately, without merging the answer into the main line.
4
+
5
+ - **Footer geometry no longer moves with the values (fix)**: the permission badge is anchored to the right edge of the first line, the `shift+tab` hint keeps its columns (reserved even while it is not shown during a run), and every live figure (turn/step counts, the various durations, tps, tokens, cache hit, context reading) is right-aligned inside its own fixed column, with an empty reading rendered as a `--` placeholder instead of the whole group disappearing. Previously any value change made the badge drift sideways (measured on one screen from column 75 to column 56) and a group appear or disappear with a threshold; now only the terminal width decides the degradation order. The tps/context/cache figures inside the telemetry run are fixed-width too, reserving those 6 columns for their slots, so the fixed width does not squeeze out a figure that used to fit; the money pair (cost/balance) stays unfixed — measured, reserving columns for a number that crosses a digit boundary only a few times per session squeezes out per-second tps at common widths.
6
+ - **Hidden clock marks (new `dscode-time-marks` plugin)**: every claimed message and every just-closed turn gains one line in the model context: `Time mark: 2026-09-19T01:58:34-07:00[America/Los_Angeles] — steer relay from session:abc arrived, waited 6m24s (composed ...)`. It is plugin-sourced context that the terminal does not render at all (reusing the existing hide-by-producer rule) and it rewrites no message body; it is injected only when an arrival or a turn end really happened, so a pure tool loop pays nothing. A relay message's `source` now carries `label`/`mode`/`composedAt`, so the queueing time has evidence to report.
7
+ - **`/btw` side question (new)**: `/btw <question>` immediately creates a child session that inherits the main session's history (seeded to the most recent completed turn; with a prefix over 400 events, or no completed turn yet, it degrades to a background summary of at most 1200 characters), runs with the `read-only` permission preset at the lowest available effort, and streams the answer into the `/btw` panel (`esc` closes it, `←/→` switches between several, and the oldest finished run retires automatically). The side session carries `parentSession` and `origin: subagent`, so it generates no session card and is a read-only row in the session list; **its content never enters the main transcript or the main model context**. The child session is released when you switch session or exit.
8
+
9
+ Verification: `npm run lint` clean; `npm run test:unit` 351/351; `npm run test:package` and `npm run test:integration` (seven probes) pass. The new and extended tests cover: the segment columns and the badge column staying put across early and late values at one width, no overflow frame by frame from 36 to 240 columns, a larger telemetry number not moving later segments, the clock-mark seed degradation and brief budget, and `/btw` panel rendering with `esc` closing it. The `/btw` kernel path (really creating a child session and streaming into the panel) has no automated end-to-end case yet and relies on a real-machine check.
@@ -0,0 +1,11 @@
1
+ # DSCODE 0.7.22
2
+
3
+ This release moves the Hub client to `@dsh-plugin-hub/cli` 0.5.0 and makes a failed launcher command explain itself: the whole cause chain, the network causes to check on a managed network, and a way out of a leftover profile directory.
4
+
5
+ - **Hub client 0.5.0 (change)**: the launcher's profile install now runs through Hub CLI 0.5.0 (`@dsh-plugin-hub/schemas` 0.5.0 as well). The pinned DSH runtime is prepared and verified by the Hub CLI itself — it runs an exact-version `npm install @deepseek-ai/dsh@<version>` into `$DSCODE_HOME/.hub/runtimes/<version>`, checks the package identity and that the executable really lives inside the package directory, and then launches it with the current Node — instead of the launcher's per-bundle `npm exec`/`npx` wrapper, so an install no longer pays a separate registry round trip for every bundle and the runtime is cached across installs. Where the behaviour stops: `pnpm` is still required for the profile's dependency install, which is why the launcher keeps its pinned `pnpm` 10.15.1 on `PATH`, and its `npx` shim stays as the guard for a Hub release that still spawns a pinned-DSH `npx` command. The command surface the launcher uses (`profile apply|upgrade|rollback|history|doctor`), the state layout (`.hub/installations/dscode/current.json`, schema version 2) and the `DSH_HUB_MACHINE` non-interactive behaviour are unchanged, so `dscode update`, `dscode rollback` and `dscode history` keep working against an existing installation. Also bumped: imapflow 2.0.2 → 2.0.5, mailparser 3.9.26 → 3.9.28, nodemailer 10.0.9 → 10.0.10, fflate 0.8.2 → 0.8.3, `@modelcontextprotocol/sdk` 1.29.0 → 1.30.0, yaml 2.8.1 → 2.9.1 and eslint 10.10 → 10.11.
6
+ - **A failed command keeps its reason (fix)**: `dscode` printed `error.message` alone, so the real cause of a fetch, lock or spawn failure — which `Error.cause` carries — never reached the terminal, and a machine that cannot reach the Hub printed a bare `fetch failed`. The launcher now prints the whole chain (`reason <- cause (CODE)`), once: a Hub or profile step attaches its hints to the error and the top-level reporter prints the message and the hints together instead of each printing its own copy. Chains deeper than five links truncate with `…`, links without a message are skipped, and a chain with nothing in it reads `Unknown error`.
7
+ - **Hub failures name the network causes (fix)**: when a Hub, update or install step fails, the launcher lists what to check on a managed network — the step needs `api.dshpluginhub.ai` and an npm registry; the Hub call does not use `HTTP(S)_PROXY`, because the pinned client calls plain `fetch` (15- and 30-second timeouts, no proxy agent); an internal mirror goes in `DSH_HUB_API_URL` inside `$DSCODE_HOME/.env`; a TLS-inspecting proxy needs its root CA in `NODE_EXTRA_CA_CERTS`; and the prebuilt GitHub release installs without the Hub at all. The `HTTP(S)_PROXY` line appears only when a proxy variable is set, and the value is never echoed, so a credential inside a proxy URL cannot leak into a terminal or a log.
8
+ - **The install step says what it is doing (fix)**: first launch printed one line and then stayed silent while npm fetched the pinned runtime and the plugin tree, which reads as a hang on a slow registry. It now also states that the step downloads the pinned Harness runtime and plugins with npm and can take several minutes.
9
+ - **A leftover profile no longer dead-ends (fix)**: when `profiles/dscode` exists without the Hub state file, every command — including `install` and `rollback` — refused with `Existing unmanaged/incomplete dscode profile; inspect <path>`, and the only way forward was knowing to delete the directory. The error now names the directory, states that the launcher will not replace it automatically, and prints the `mv` that moves it aside, with both paths single-quoted for the shell.
10
+
11
+ Verification: `npm run lint` clean, `node scripts/check-docs.mjs` clean, `npm run test:unit` 357/357, and `npm run test:package` passes (exact tarball integrity, exports, syntax, launcher lock dependency, and no local state or build paths). `npm run verify:hub` against the rebuilt candidates reaches `PASS real Hub install + DSH compose` — a real Hub CLI 0.5.0 install of the profile plus the real DSH composition — and then stops at its agent-loop probe on this machine, because the session's own sandbox refuses to apply a nested profile (`sandbox-exec: sandbox_apply: Operation not permitted`), the documented in-session limitation; that probe therefore runs in CI. Three new unit cases cover the failure formatting (chain, truncation, empty chain), the unmanaged-profile message, and a profile path containing a quote that must stay one shell argument. The failure output on a real corporate network, and the Hub 0.5.0 upgrade path for an installation that already exists, have no automated end-to-end case and rely on the next real-machine install.
@@ -0,0 +1,14 @@
1
+ # DSCODE 0.7.23
2
+
3
+ This release pins a session to one folder, makes cross-session traffic visible in the terminal, closes the per-turn cost loop, and removes the per-frame re-wrap that streaming paid for the whole live region.
4
+
5
+ - **A session stays in the folder it was created in (change)**: the workspace, the durable log and the shell already followed the session header's `cwd`; what was missing was the second half of the rule. Resuming a session now runs in that folder whichever entry point asked for it — `--resume`, the `/resume` picker, `/search`, or a queued switch — and a resume that leaves the folder the terminal was launched in prints one warning notice naming both folders, so a window that silently changed project is visible. `--continue` keeps its current-directory scope. Where the behaviour stops: the folder is chosen at creation and no command moves an existing session, so `--cwd` only decides where a *new* session binds; reaching another project's context still means reading that session (or `dscode send`), not resuming it here. `dscode exec --resume` is outside this display path: it writes the session's log in its own folder while the one-shot process keeps the directory it was launched in, so a turn that must touch that folder is run from it.
6
+ - **Cross-session communication is visible (change)**: while a `send_session`/`reply_session` call is in flight the activity line reads `⇄ sending to <peer>`, a request awaiting its answer reads `⇄ waiting for <peer>`, and a settled send or an inbound relay prints one notice line. Both surfaces paint with the `steered` violet and the `⇄`/`→`/`←` glyph family instead of the brand blue and `•` every other local notice uses, so another session's traffic never reads as this session's own output. `/tasks` lists this session's messages on demand with direction, peer, kind/mode, delivery state and a bounded body. The view is folded from the root log (`tool/call`, `tool/result`, and the bridge's relayed `user/message`), so a restarted session rebuilds its history and announces only new traffic. Where the behaviour stops: only an explicit `reply` clears an outstanding request (a progress notify does not), and a relay whose body does not carry the bridge's documented `[kind/mode]` header leaves the kind unknown and is therefore never counted as an answer.
7
+ - **The last completed turn's cost, and a cost per turn (feature)**: the footer's money figure gains the turn it just finished (`$1.23 ❄️ · #12 $0.04`), and `/usage` gains a `cost` column pricing every turn from the same ledger, `+` marking a turn whose settled calls were not all priceable. Attribution charges a call to the turn that was running when it started, by binary search over the turn windows, so the once-a-second footer read falls from O(calls × turns) to O(calls × log turns) — measured 0.63 ms for 8000 calls across 300 turns. A call in the gap between two turns, or before the first one, is reported as unattributed rather than charged to a neighbour. Where the behaviour stops: a session older than the cost ledger shows `--` per turn, and the footer's turn figure drops before the session total on a narrow terminal.
8
+ - **Streaming no longer re-wraps the whole live region every frame (fix)**: the live list was re-created for every event, so unchanged settled-but-unflushed entries were re-flowed on each frame while only the streaming text actually changed. Rows are now memoized by entry identity (the projection replaces an entry object whenever its content changes) under a per-width/verbose cache. Measured on 16 long entries: 3.12 ms/frame → 0.001 ms/frame. Where the behaviour stops: an entry whose object really changes still re-wraps, which is what correctness requires; the cache keys on the floored column count, so a fractional width wraps at the width it keyed.
9
+ - **The status bar carries the loaded skill count (feature)**: a `skills` figure reads the live session catalog, so it follows a skill added mid-session or a session switched to another workspace, and `/statusline` toggles and reorders it. It stays `--` until the first catalog read settles.
10
+ - **The footer is two balanced rows (change)**: row 1 names the session and the model with its effort (`○ title · deepseek-flash @ ultra`), row 2 carries the status figures and closes with the live metrics as one left-hand cluster (`~24.6 tps · 18.2 tps avg · 13% ctx · $0.42 · 87.3% cache`). Every figure reads value first with a short qualifier, and a balance the provider cannot report is dropped instead of parked as `$--`. The order in the cluster is current → average → context → spend → last turn → cache; `footer.current` is gone from the interface catalog and `footer.context` is the untranslated `ctx` abbreviation, like `tps`.
11
+ - **Ancestor skill discovery is on by default (change)**: `.dsh/skills`, `.agents/skills` and `.claude/skills` from every directory between the working directory and home register at rank 300 with no configuration, nearest first, so a shared `~/Workspace/.dsh/skills` is visible to every project below it. `DSCODE_SKILL_ANCESTORS=0` (also `off`, `false`, `no`, `none`, `disable`) turns it off; an unrecognised value keeps the default on instead of reading as off, while `DSCODE_PROJECT_HOOKS` keeps its fail-closed enable spellings.
12
+ - **The Ink repaint ledger no longer leaves a blank band (fix)**: it reserved the whole previous frame height after a static flush, so the live region a settled step freed stayed on screen as blank rows above the composer that the next stream had to refill — 28 rows in a model of one turn on a 40-row terminal. It now reserves only the rows the flush did not consume, which drops that band to what the flush left over (2 rows in the same model) while the composer still never rides up. `scripts/patch-ink.mjs` upgrades an already v2-patched `node_modules/ink` on the next `npm run setup` or launch.
13
+
14
+ Verification: `npm run lint`, `node scripts/check-docs.mjs`, `npm run typecheck` and `npm run typecheck:strict` are clean. `npm run test:unit` runs 403 cases; 402 pass, and `tests/code-review.test.mjs` does not complete inside a DSCODE session — it spawns real `git` subprocesses in temporary directories and the run ends with `Promise resolution is still pending but the event loop has already resolved`, which AGENTS.md documents as the in-session sandbox limitation, so the suite's exit status is not a usable gate here and that file needs a normal terminal. New cases cover the folder comparison (same/different/prefix/symlink/Unicode normalization), the CLI resume resolver, the cross-session fold (send/reply/relay, reply-only clearing, bounded rows, namespaced ids, the `/tasks` text), the attribution windows and the binary lookup cross-checked against a linear scan, the `/usage` cost column, the live-region cache and the projection identity invariant, and the footer's drop order. The per-turn figures were not exercised against a real ledger on a paid session, and the cross-session display was not observed with two live sessions in a real TTY.
@@ -0,0 +1,11 @@
1
+ # DSCODE 0.7.24
2
+
3
+ This release lets an event start a session unattended, caps a goal's rounds from the command plane, adapts MiMo V2.6 on the OpenRouter route and trims that route's `/model` to a curated list.
4
+
5
+ - **An event starts a session (feature)**: trigger definitions live in `<state>/triggers/` and `<workspace>/.dsh/triggers/` (a project file wins on the same id) with `interval`, `calendar`, `watch`, `poll` and `external` sources, an absolute workspace, a goal objective with a round cap and run limits. An event may carry only data — `source`, `title`, `text` and scalar `fields` under a required `eventId` — so nothing can smuggle a permission or a session into a run, and `ask` is refused because an unattended run can never answer an approval. `dscode trigger run <id>` takes a single-flight lock and refuses a disabled definition, a missing workspace, a repeated event (a scheduled firing is identified by its cadence window), a spent daily cap and a too-recent run, recording every outcome with its reason, exit code, session, cost and rounds in `triggers/runs.jsonl`. `fire`, `emit`, `list`, `show`, `log`, `log --failed`, `events`, `new`, `enable` and `disable` complete the CLI, which the published launcher routes like `exec`, and the terminal reads the definitions, records and spool through `/triggers`. Where the behaviour stops: nothing notifies on a failed run yet — the run log is the pipe a notifier will read.
6
+ - **Unattended runs, and launchd carries the schedule (feature)**: the spawned Host replaces the terminal with the trigger overlay, creates its goal through the goal service (the model-facing tool requires a human turn), delivers the prompt with the event's values and stops on the goal's own end, a round or cost cap, a pause, the timeout or a needed approval — fail closed, marked `approval_required`. `dscode trigger install <id>` writes and loads a launchd LaunchAgent (`interval`/`poll` → `StartInterval`, a five-field `calendar` → `StartCalendarInterval`, `watch` → `WatchPaths`), refuses any cron shape launchd cannot express instead of approximating it and prints the crontab equivalent, while `poll` runs its `check` in the workspace and starts a session only on exit 0. Where the behaviour stops: this scheduling is macOS-only, and a `poll` whose `check` fails starts nothing and tells nobody.
7
+ - **`/goal[20]` caps the rounds from the command plane (feature)**: `/goal[20] <objective>` creates the goal with a 20-round cap and `/goal[20]` re-caps the current goal, so an unattended task stops after the rounds the human allowed; a cap with no goal, or a control word after a cap, is refused with the usage. Where the behaviour stops: upstream's `/goal` remains the surface — a runtime patch (`dsh-command-goal`) adds only the shorthand.
8
+ - **MiMo V2.6 drives the OpenRouter route (feature)**: `xiaomi/mimo-v2.6-pro`, `-flash` and `-pro-ultraspeed` join DeepSeek V4 and Kimi K2.6 in replaying `reasoning_content` on an assistant turn, because Xiaomi answers 400 Invalid Format when a thinking-mode multi-turn request does not pass the field back; the whole `xiaomi/mimo-v2.6` line is matched, so a new size in that family arrives covered. Context, prices and reasoning bands come from OpenRouter's listing unchanged (`off`/`low`/`medium`/`high`, default `high`; the endpoint is fp8, inside the route's quantization allow-list, so `require_parameters` keeps it routable). Where the behaviour stops: the ids, the listing fields and the request body were checked against the live listing, but no probe with a real OpenRouter key has run, so MiMo is not yet claimed as tuned and tested.
9
+ - **The OpenRouter picker is curated (change)**: `/model` offered every tool-calling model in the live listing — 373 of them, in alphabetical order. The route keeps `LISTED_MODELS`, 28 ids: the current DeepSeek, GLM, Kimi, Qwen and MiMo models plus the flagship line of Anthropic, OpenAI, Google and xAI, each verified to exist and to call tools against the live listing. Only the picker narrows: `resolveModel` still serves every id the listing knows, so a session already on a trimmed model, `dscode exec --model` and a provider switch keep working. Where the behaviour stops: the list is edited by hand, so a new flagship and a retired id both need that edit; the Western flagships stay best-effort, and only the five tuned labs are covered by the probe script.
10
+
11
+ Verification: `npm run check` — lint; typecheck and typecheck:strict; unit, integration, packaging and evaluation — is green on the code this release ships (`05e28ac`) on both Node 24 and 22.19.0 through the `Checks` workflow, `Linux e2e` is green, and the release build re-runs the same gate before publishing. New cases cover the curated picker (a listed flagship appears, a usable but unlisted model does not, and an off-list model still resolves so an existing session keeps running), the MiMo entries' listing shape and reasoning bands, and the family-wide `reasoning_content` replay; `scripts/verify-login-runtime.mjs` asserts the trimmed directory in a real Host. Live checks, none of them model calls: all 28 curated ids exist and can call tools in OpenRouter's listing, and the MiMo entries parse to their real context, prices and bands. No automated case covers: a real OpenRouter key call to MiMo (the 400 it guards against is documented by Xiaomi, not reproduced here), a launchd install on a real schedule, a trigger fired end to end without a terminal, or curated-list drift — a retired id is caught by reading the picker, not by a test. `tests/code-review.test.mjs` does not complete inside a DSCODE session, the documented in-session limitation (it spawns real `git` subprocesses and the run ends with `Promise resolution is still pending but the event loop has already resolved`); macOS-only paths such as TUI rendering, computer use and accessibility permissions have no automated case.
@@ -0,0 +1,8 @@
1
+ # DSCODE 0.7.25
2
+
3
+ This release lets a repeated install keep a tar installation current instead of refusing, and adds a Homebrew formula for the launcher.
4
+
5
+ - **The installer upgrades instead of refusing (change)**: re-running `curl | sh` reads the version already installed and acts on it — equal or newer is reported and left alone with exit 0, older is handed to that installation's own `dscode update`, which downloads the release, verifies the publisher's sha256 digest, migrates `.runtime`, `.env` and the local config, and keeps the previous tree as `.dscode-backup-<version>`. Anything the installer did not create is still refused with the path it found — a directory that is not a DSCODE installation, or a `dscode` command belonging to another installation such as a source checkout — and that check now runs before the download instead of after it. Where the behaviour stops: the swap is the installed updater's work, so a tar installation older than `dscode update` is refused rather than replaced, an upgrade of the installation a session runs from still needs that session to exit, and a pre-release installation is superseded by its release.
6
+ - **A Homebrew formula (feature)**: `brew tap qiz029/tap && brew trust qiz029/tap && brew install dscode` installs the published launcher tarball into the formula's `libexec` — so the pinned dependency graph stays npm's rather than the formula's — links `dscode`, and writes `.dscode-brew` beside `cli.mjs`. `brewManaged()` reads that marker, so on a formula installation `dscode update` moves only the Hub profile and leaves the launcher to `brew upgrade dscode`; an explicit version that would put the profile ahead of the launcher is refused. The tap carries its own workflow that follows `npm view @toddzheng024/dscode version` daily, recomputes the tarball's sha256 and commits the formula update. Where the behaviour stops: Homebrew 7 refuses to load a third-party tap's formula until the tap is trusted, so that step is part of the install; the formula claims `dscode` in the Homebrew prefix, so an `npm install -g` launcher already linked there has to be removed first; and the formula's own install has not run on a machine whose Command Line Tools Homebrew accepts.
7
+
8
+ Verification: the release build runs `npm run check` on both Node 24 and 22.19.0, and `Linux e2e` is green. New cases cover the installer's version decision — an older installation handed to its own updater without any download, an equal or newer one left untouched, a pre-release not mistaken for the release it leads to, and a foreign command still refused with its symlink left in place — and the Homebrew marker the launcher reads. The installer's upgrade path was also run end to end against real releases: 0.7.23 installed into a scratch directory, the installer re-run to move it to 0.7.24 through its own updater with `.dscode-backup-0.7.23` left behind, and a third run reporting that nothing was changed. The formula was checked as far as this machine allows — `ruby -c` on it, `brew info` loading it, its pinned sha256 equal to the published tarball, and the npm global-prefix install with the marker read back by the new launcher code — but **no `brew install` completed here**: `brew doctor` reports this machine's Command Line Tools do not support macOS 26, which Homebrew refuses to install past, so the formula's install and test blocks have no automated or manual confirmation yet. `tests/code-review.test.mjs` does not complete inside a DSCODE session, the documented in-session limitation (it spawns real `git` subprocesses and the run ends with `Promise resolution is still pending but the event loop has already resolved`).
@@ -0,0 +1,18 @@
1
+ # DSCODE 0.7.26
2
+
3
+ Superseded by [0.7.27](0.7.27.md): post-publication verification found that Hub CLI 0.5.0 rejects the empty root file generated during fresh installation. Use 0.7.27 or newer for npm/Hub installs.
4
+
5
+ This release adds durable trigger scheduling and script event sources, fixes model-effort and provider-error presentation, and reorganizes the footer around API-backed TPS and right-aligned finances.
6
+
7
+ - **Trigger session modes (feature)**: an event can create a fresh session or resume a persistent session bound to the trigger id. Persistent events retain context while receiving independent goals and execution limits. Events serialize under the existing locks; missing bound sessions or workspace changes fail rather than silently discarding history.
8
+ - **Cron and delay jobs (feature)**: calendar, interval and polling sources enqueue durable SQLite jobs, and one-shot jobs support delay/absolute-time scheduling and cancellation. The shared scheduler tracks cursors, time zones, misfires, overlap and pending reasons. Failed runs are not automatically retried, and unattended approval requirements stop a run for review. Installing and starting the background scheduler remains explicit.
9
+ - **Agent and TUI management (feature)**: `trigger_manage`, `trigger_jobs`, `trigger_scheduler`, `trigger_source`, `/trigger` (alias `/triggers`) and the CLI share management state and workspace boundaries. The slash command runs without calling a model. Mutations retain approval checks; read-only/plan sessions, subagents and unattended runs cannot mutate schedules through these management tools.
10
+ - **Script event sources (feature)**: finite polling scripts and supervised daemon loops can emit events through a scoped local ingress into the durable queue. Event identity, retry acknowledgements, conflict detection, queue backpressure and lifecycle logs make loop integration inspectable. Filesystem sandboxes and guardian processes restrict sources and clean up ordinary descendant process groups. Unsupported sandbox environments fail closed; detached-process evasion and arbitrary external services are outside the automated guarantees.
11
+ - **DSCODE preset and effort selection (change/fix)**: the interactive preset stays fixed to DSCODE, with `/mode` hidden and other preset selections rejected. Legacy transcripts survive resume under DSCODE. Switching from MiMo `medium` to DeepSeek now opens its effort picker at the advertised default `high`; the footer no longer borrows an earlier model's effort. Supported selections are retained, and request-boundary validation remains in place.
12
+ - **Content-policy failures (fix)**: OpenRouter's untyped content-filter 403 is classified as `CONTENT_POLICY`, with an explanation that the turn stopped, instead of being mistaken for an authentication problem. Ordinary credential failures keep their classification. This improves live and replayed error presentation; it cannot bypass a provider's policy or automatically retry a rejected request.
13
+ - **API-backed smoothed TPS (change)**: completed main-agent requests contribute their reported output token count divided by measured full request duration, including first-token latency. Each valid request multiplies older sample weights by `0.5` before adding its own weight of one and normalizing. Idle time does not age the reading; aborted or missing-usage calls do not update it, and a new model/provider/effort request resets it. Byte-count estimates and the `~` prefix are removed. A separate request indicator animates without changing the number and respects the animation preference.
14
+ - **Grouped footer (change)**: TPS, average, context and skills remain on the left; cost, DeepSeek balance, peak/off-peak, last-turn cost and cache align together on the right. Narrow terminals move finances to a third row, and the live viewport and IME cursor account for its height. Very narrow layouts can omit average TPS or last-turn cost and finally clip oversized financial text; unavailable balance data remains unavailable.
15
+
16
+ Verification: `npm run check` passed locally, including 542 unit tests under coverage, both TUI type checks, lint, all isolated Harness integration probes, package integrity/exports checks, and 51 evaluation tests. The documentation checker also passed. Render cases cover 48, 60, 80 and 120 columns, stable numeric TPS during activity animation, and third-row viewport accounting. Deterministic fixtures cover provider errors, model switching, durable jobs, script ingress and trigger session modes without paid model requests. `npm run build:packages`, `npm run release:hub` and `npm run verify:hub` also passed: the candidate installed through the real Hub lifecycle, ran deterministic agent/shell/subagent, messaging, card and memory probes, and survived a failed upgrade, successful upgrade and rollback with state retained. This local check used a loopback registry, not public package discovery.
17
+
18
+ Not covered by those checks: human acceptance in a live terminal/IME, Linux script sandbox execution on this macOS workstation, real provider inference or moderation behavior, and a newly installed persistent scheduler on the user's machine. The release does not install or start such a scheduler.
@@ -0,0 +1,8 @@
1
+ # DSCODE 0.7.27
2
+
3
+ This patch release repairs fresh npm/Hub installation and adds the native dependency-lock path to release verification.
4
+
5
+ - **Fresh installation (fix)**: Harness composition creates an empty `cordis.yml` after Hub CLI 0.5.0 records installation inputs. The final receipt check previously rejected that generated file and discarded the staged profile. The launcher now carries a build-time vendored CLI that excludes only the exact generated file hash when no package-manager hooks are present. Custom root content, hook-bearing profiles, other configuration files and lockfiles remain checked. No recipient dependency files are patched at install time.
6
+ - **Release verification (fix)**: candidate verification now runs the native locked installer, starts the installed launcher with `--dump-config`, and checks Hub doctor. Publication requires those results against the exact package hashes. Existing external-executor agent, failed-upgrade and rollback probes remain, but no longer stand in for native installation.
7
+
8
+ Verification completed before tagging: `npm run check` passed (lint, both typechecks, 543 unit tests, 83.55% measured `.mjs` line coverage, isolated Harness integration probes, package checks and 51 evaluations); documentation links are clean. `npm run verify:hub` passed the native locked installation, launcher first start and Hub doctor, as well as installed-agent, failed-upgrade, replacement and rollback probes. The regression test accepts only the pinned generated root and rejects custom root content, package-manager hook cases, other input changes and lock changes. No paid provider request or human TUI interaction is part of this patch's installation proof.
@@ -0,0 +1,22 @@
1
+ # DSCODE 0.7.28
2
+
3
+ This release moves the whole `@deepseek-ai/dsh*` runtime from `0.1.5-rc.2` to `0.1.7-alpha.2` and carries DSCODE across the four upstream planes that release rewrote: configuration, agent presets, message attribution and the DeepSeek wire protocol.
4
+
5
+ - **Runtime pin (upgrade)**: every `@deepseek-ai/dsh*` dependency and override is now `0.1.7-alpha.2`, with `@deepseek-ai/cordis` at `4.0.4`, `@deepseek-ai/cordis-plugin-loader` at `1.0.5` and `@deepseek-ai/schemastery` at `3.18.4`, the versions that release requires. Five packages disappeared upstream and are replaced by their successors: `dsh-agent-presets` → `dsh-agent-preset` plus `dsh-agent-preset-registry`, `dsh-code-runtime{,-worker-thread}` → `dsh-ptc-runtime{,-node}`, `dsh-workflow-worker-thread` → `dsh-workflow-ptc`, and `dsh-settings-file` → `dsh-config-editor`. The upgrade brings upstream's `run_code` sandbox escalation, durable image offload, the MCP client on `@modelcontextprotocol/client` 2.0.0, subagent permission inheritance and compaction retry recovery. `0.1.7-alpha.2` is upstream's `alpha` channel, not a release candidate: it is the line upstream is developing, and a later alpha may move these interfaces again.
6
+ - **Configuration (breaking upstream API)**: DSH replaced settings sections with volatile configuration — a `.volatile()` field arrives as a reference the Settings form and a profile edit both write, and `settings.installSection` is gone. The OpenRouter and Grok routes now mark their editable fields volatile, read a snapshot per request, address their form by the profile entry id (`dscode-openrouter`, `dscode-grok`), and re-register the route from `loader/volatile-update` when the retry policy changes. `@anionex/dsh-computer-use` 0.3.2 still calls the older `ctx.settings.register`; DSCODE now mounts that bundle through its own `plugins/computer-use` row, which restores the method as a read-only view over the composition config before the provider's constructor runs. Nothing patches the installed package, so the repository and the npm bundle behave identically.
7
+ - **Agent presets (breaking upstream API)**: the registry reads declaration rows and no longer discovers presets from directories, and the shipped `standard`/`ptc`/`minimal` rows live in the `dsh-web-app` bundle this profile does not carry. `presets/dscode/agent.cordis.yml` therefore travels as one `@deepseek-ai/dsh-agent-preset` row inside the profile patch — rendered by `scripts/preset.mjs`, which indents the file as text so its `!!js` expressions and comments survive — and `dscode` is the only declared preset and the deployment default. Setup no longer materialises `.runtime/agent-presets/dscode`, and the npm bundle no longer ships a `presets/` directory. DSCODE already locked its mode to `dscode`, so the roster is unchanged in practice; a session recorded under an upstream preset still resumes and migrates, which `verify-runtime-foundations` covers.
8
+ - **Permission preset rename (breaking)**: DSH 0.1.7 reserves the name `auto` for its own Auto integration (full access with approval off) and refuses a configured preset of that name, so DSCODE's reviewed preset is now **`auto-review`** — the same `workspace-write` plus `approval: ask` bundle with the model reviewing eligible requests. Use `/permission auto-review`, `dscode exec --permission auto-review` and `permission: auto-review` in a trigger; the trigger gates still accept the old name for definitions written before this release. A session whose recorded preset is `auto` keeps its sandbox and approval values and shows as `custom` until it is switched.
9
+ - **Message attribution (breaking upstream API)**: the shared `plugin` source kind is retired — every producer declares its own `kind`, and session format v4 refuses a message that still carries the wrapper. DSCODE's injecting plugins now name themselves (`dscode-session-bridge`, `dscode-time-marks`, `dscode-shell-exec`, …), and one helper, `plugins/message-source/kind.mjs`, resolves all three shapes durable history can hold: the current kind, the pre-upgrade `{ kind: 'plugin', plugin: '<producer>' }`, and the `plugin:<producer>` kind the v3-to-v4 session migration writes. The terminal's transcript keys its hidden snapshots, reminder rows and relay rendering off that helper, so a resumed older session still renders as before. The bridge also moves from the retired `agent/session-start` event to `agent/created`, which 0.1.7 awaits at the same point; without that change every turn in a bridged session ended with "Session communication owner is not ready".
10
+ - **DeepSeek wire protocol (upgrade)**: the adapter now speaks the DeepSeek Messages API, where the system prompt is a request field and the effort rides in `output_config`. The Ultra patch was rewritten accordingly: Ultra is advertised in the model's effort catalog, normalised to the provider's `max` when the request is serialised, and the Ultra and Flash policies are appended to the `system` field by two new helpers in `plugins/ultra/policy.mjs` (the message-shaped pair stays for the OpenRouter and Grok adapters). Image offload follows upstream's new contract: a route reports how many oldest occurrences exceed its budget with `IMAGE_OFFLOAD_REQUIRED` and the `compaction-image-offload` executor records that choice durably, instead of each request dropping the oldest images on its own — DSCODE's OpenRouter adapter now does the same.
11
+ - **Computer Use (known limitation)**: `@anionex/dsh-computer-use` 0.3.2 restores its execution tools on resume by reading the durable log for the loaded skill, and it looks for the pre-0.1.7 shape — a `tool-result` content block carrying `toolCallId` and `isError` — which session format v4 moved onto the message. Live activation is unaffected, because that path reads the execution result: loading the `computer-use` skill exposes `computer_observe` and the rest as before, and the native helper handshake passes. A **resumed** session keeps the `computer_use_activate` bootstrap but regains the execution tools only once the skill is loaded again. The pinned package has no newer release; the harness probe records the behaviour as `HARNESS_PROBE_NOTE` instead of asserting a restoration this dependency cannot perform.
12
+ - **Pinned runtime patches (maintenance)**: `RUNTIME_VERSION` is `0.1.7-alpha.2`. Three of the nine patches needed new anchors — the subagent tool's recursion budget now comes from `subagents.resolveMaxDepth`, the bash tool's config schema is multi-line, and the DeepSeek adapter's ultra path was rewritten as described above — and all nine apply, parse and stay idempotent against the new tree.
13
+
14
+ Verification completed before tagging: `npm run check` passed on macOS (lint, both typechecks, 543 unit tests at 83.32% measured `.mjs` line coverage, the nine native Harness integration probes, both package tarballs and 51 evaluations), and the patched runtime was additionally re-validated by applying every patch twice and parsing the result. `npm run doctor` also passed against a real profile boot on the new tree: both the shipped `standard` and the DSCODE preset composed, 51 tools with scoped Chrome MCP discovery, skill activation, file editing and shell execution, the compaction provider, a nonempty session resume, the full auto-review allow/deny/human path with its audit, child worktrees and effort selection, manual compaction, and a healthy native Computer Use helper (`ready: true`, accessibility granted). `npm run verify:hub` passed too, after the same preset gap surfaced there: the installed
15
+ profile declares only DSCODE's preset, so the agent probe's `standard` mount failed until the
16
+ verification's overlay declared it from the `dsh-web-app` copy the installation carries. It
17
+ then verified the native locked Hub install, launcher first start, Hub doctor, the installed
18
+ bundle's agent loop, shell, subagent worktrees, auto review, compaction and telemetry, its
19
+ session messaging, cards and memory probes, and a failed upgrade with rollback. The
20
+ documentation checker prints clean.
21
+
22
+ What has no automated case here: the interactive TUI was not driven by hand for this release, so the terminal's own rendering of a 0.1.7 session is covered only by `tests/tui-render.test.mjs` and the typechecks; no paid provider request was made, so the Messages-API changes are proven against fixture streams rather than DeepSeek's live endpoint; and no desktop action was driven through Computer Use — its helper health and tool exposure are proven, its actual screen control is not.
@@ -0,0 +1,12 @@
1
+ # DSCODE 0.7.29
2
+
3
+ This release adds the account plane DSH 0.1.7 introduced — a browser sign-in that authenticates the DeepSeek route without an API key — and repairs two composition rows the 0.1.7 upgrade left misaligned.
4
+
5
+ - **`/account` (new)**: sign the DeepSeek route in with a DeepSeek account through the system browser. `/account login` starts one attempt, `/account` reports whether a grant is stored plus the account identity, recharge wallets and — separately — bonus wallets and the platform's usage and top-up pages, `/account cancel` abandons an attempt in flight, and `/account logout` removes the grant from this machine. The flow is the upstream one: PKCE (S256), a `state` the provider compares in constant time, a one-time code exchange, and the grant committed to the same local credential store as the API keys. A signed-in machine needs no `DEEPSEEK_API_KEY`; a stored key stays the fallback, and a route pointed at a non-default base URL deliberately never receives the account token. The command's output carries no token — account state is the client-safe projection, and the token stays Host-only inside the LLM route. Every string is translated in all six interface languages. See [Account login](../account-login.md).
6
+ - **Loopback callback server (new)**: the account provider registers `/oauth/callback` on the Host's HTTP server, so the TUI profile now composes `@deepseek-ai/dsh-host-webserver` on `127.0.0.1` with an OS-assigned port. It carries **no route except while a sign-in runs** — the callback appears when an attempt starts and is removed when it settles — and this profile mounts none of the Web shell's frontend or API rows, so anything else answers 404 and a callback without a valid `state` and `code` answers 400. `DSCODE_ACCOUNT_LOGIN=0` removes the listener entirely; `/account login` then refuses with that reason and the other subcommands keep working.
7
+ - **Host-plane workflow engine (fix)**: DSH 0.1.7 renamed that row from `workflow-worker-thread` to `workflow-ptc`. A Loader patch addresses rows by id, so DSCODE's disable silently stopped landing and `workflowEngine` was published process-wide, exactly the leak the preset's entry-local realm exists to prevent. The disable now names the current id, and a new composition test checks **every** id DSCODE patches against the bundles this profile composes, so the next upstream rename fails in the suite instead of in a running session. The audit found no other stale target.
8
+ - **Redundant PTC runtime row (cleanup)**: 0.1.7 ships the Node PTC runtime in the base composition, and DSCODE's own insert carried the same id, so it only re-patched that row rather than mounting a second one. The insert is gone; `ptcRuntime` still resolves from the base row.
9
+
10
+ Verification completed before tagging: `npm run check` passed on macOS (lint, both typechecks, 558 unit tests at 83.87% measured `.mjs` line coverage, the nine native Harness integration probes, both package tarballs and 51 evaluations); `npm run doctor` booted a real profile; and `npm run verify:hub` passed the native locked install, launcher first start, Hub doctor, the installed bundle's agent, messaging, cards and memory probes, and a failed upgrade with rollback. The account flow was additionally exercised against the live platform without completing a login: `startSignIn` returned a real `platform.deepseek.com/dsh/authorize` URL, the loopback `/oauth/callback` route existed during the attempt and answered 400 without a valid `state` and `code`, and cancelling removed the route (404) and left the machine signed out. The twelve account unit tests drive the whole command with a service double, including the case that made the first implementation wrong: the authorize URL does not exist when `startSignIn` returns, so the browser is opened only after the URL is published. The composition test was mutation-checked by restoring the stale id, which fails it.
11
+
12
+ What has no automated case here: completing a sign-in in the browser needs a real account, so the callback, code exchange and grant commit are proven only by the provider's own contract and the live attempt up to the browser step; no paid provider request was made; and the interactive TUI was not driven by hand, so `/account` is covered by its unit tests and the command registration probe rather than by a rendered session.
@@ -0,0 +1,23 @@
1
+ # DSCODE 0.7.3
2
+
3
+ This release adds OpenRouter: `/provider` switches the same set of DeepSeek models between the official DeepSeek API and OpenRouter; it also fixes several harness problems the evaluation exposed — a cost ledger with no elapsed time, model calls missing from the ledger, review skipping merged changes, and the npm launcher lacking `dscode exec`.
4
+
5
+ - **`/provider [deepseek|openrouter]`**: with no argument it opens a picker showing each provider's key status. The first switch to OpenRouter declares pi-ai's `openrouter` route in the settings document (DeepSeek V4 Flash, V4 Pro, V4 Flash Vision Exp; an existing `openrouter` configuration is not overwritten and can be edited later in `/model` → `a`); when the key is missing it raises an input box and continues the switch after saving, landing on the corresponding model of the current one and keeping the current effort (the model default when the target does not support it). A running turn has to be stopped first.
6
+ - **`/login [deepseek|openrouter]`**: saves either provider's key, targeting the current provider when called without an argument. `OPENROUTER_API_KEY` is stored in `~/.dscode/credentials.yaml` like `DEEPSEEK_API_KEY` (`0600`, shared across projects and versions), and an environment variable takes precedence. An argument that is not a provider name is refused outright and never echoed (so a key pasted by mistake is not printed).
7
+ - **Ultra works on OpenRouter too**: the pi-ai adapter is patched and vendored with the bundle like the DeepSeek adapter. Ultra on OpenRouter sends `xhigh` with the collaboration policy, and below Ultra no delegation tools are offered. The OpenRouter route provides off/low/high/max like the official one, with `low` sent as `high` (DeepSeek handles low that way itself), so session cards and child-agent low requests work as usual and `/effort` keeps its band bar.
8
+ - **The footer follows the current provider**: the balance shows that provider's (for OpenRouter, credits minus usage); an OpenRouter call is estimated from the fixed pi-ai catalogue prices (ledger `priceVersion` `openrouter-pi-ai-0.85.1`), and the 🔥/❄️ peak/off-peak marks are shown for DeepSeek only. `/status` states the actual wire effort of Ultra on each route; a missing-credential error now points at `/login`. Fix: when a model id carries a vendor segment (`openrouter/deepseek/deepseek-v4-flash`), `/effort` could not find the model.
9
+ - **The ledger records the elapsed time of every model call**: an `end` row used to reuse the start's `time`, so a single call always took 0. An `end` row now carries `endTime` and `firstTokenTime` (the first text, reasoning or tool-argument increment), while `time` is still the start (used for pricing).
10
+ - **Every model call made on behalf of a session enters the ledger**: the review tool and `/review`, memory extraction and consolidation, session cards and `/doctor` used to carry no `sessionId` and never reached the ledger. They now count towards their session with their own `purpose`; the attribution travels through async context rather than adding a `sessionId` to the request (which would also trigger session-log delivery, cache affinity and agent-only prompt rewriting). Compaction and session titles were already recorded.
11
+ - **Review no longer skips committed or merged work**: with no uncommitted change, the default scope becomes the commits since this task began (the task's starting HEAD read from HEAD's reflog); `--commit` on a merge commit now diffs against its first parent instead of producing an empty combined diff.
12
+ - **The npm launcher provides `dscode exec`**: it runs exec with the installed Hub profile, with the same options, stdin prompt and exit code as the source form; when it is not installed yet it installs first, with the install output on stderr so stdout stays pipeable.
13
+
14
+ Exit DSCODE sessions using the same data directory before upgrading:
15
+
16
+ ```sh
17
+ npm install -g @toddzheng024/dscode@0.7.3
18
+ dscode update 0.7.3
19
+ ```
20
+
21
+ `dscode-0.7.3.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
22
+
23
+ Verification covers unit, integration, TUI, package build and the coverage baseline. New here: Ink rendering tests for the `/provider` picker and `/login` arguments; in a real Host, declaring the OpenRouter route, saving and reloading both keys, and intercepting an OpenRouter request before it goes out to check the URL, key, effort, tools and Ultra policy; ledger elapsed-time and async-attribution tests, plus session-card calls counting towards the session ledger in a real Host; the review fallback in a no-ff merge repository; and the launcher `exec` exit code and argument passthrough. No real OpenRouter call was made.
@@ -0,0 +1,19 @@
1
+ # DSCODE 0.7.30
2
+
3
+ This release adds a coordinator mode: `/delegate` has the main agent plan a task on a board with priorities and dependencies, run the parts as child agents in isolated Git worktrees, verify each result and merge what it accepts. `/delegate-dashboard` shows that board as a kanban. It also raises the child cap and redraws the welcome snowflake.
4
+
5
+ - **Child cap by effort (changed)**: a parent can now run five direct children at once below Ultra and twenty at Ultra, instead of three at every effort. The runtime reads the parent's effort each time it launches or wakes a child, so dropping out of Ultra brings the lower cap back at once. Admission reservations still stop concurrent launches from racing past the cap. One delegation level is unchanged. The below-Ultra shell policy still asks for one child at a time outside `/delegate`; only the runtime ceiling moved.
6
+ - **`/delegate <task>` (new)**: the main agent becomes the coordinator. The command only checks that the session starts at a clean Git repository root and is not a child agent. It then queues the task with a fixed coordinator protocol. The transcript shows it as one `/delegate …` line, not the protocol text. Planning, dispatch, verification and merging are the model following that protocol. The runtime enforces what it can: the child cap, one delegation level, dependency order at launch, and the board itself. Children work only in their own worktree, leave their changes uncommitted, and ask the main agent with `send_message` to `/` when they are blocked.
7
+ - **Delegate board (new)**: the `delegate_board` tool records each task with a title, its planned child name, a priority (`high`, `normal`, `low`) and the tasks it depends on. The board rejects dependency cycles. A pending task is ready once every dependency is complete, and launching a blocked task is refused before it takes a slot. Ready tasks are ordered by effective priority: a task's own priority or that of any open task waiting on it, whichever is higher. Work that unblocks a high-priority task therefore goes first. Launching a child under a planned name moves its task to running. Running and verifying come from the child's live status, not from what the model last reported. A task is completed only with the main agent's verification evidence. Dropping a task releases whatever waited on it. Children never see the tool. Boards are kept per session under `$DSH_HOME/delegate-boards/` and survive a restart. A new `/delegate` clears a board whose tasks are all finished.
8
+ - **Board state as messages, not the system prompt (design)**: the coordinator receives the board and its free slots as a message ahead of its next step, and only when the board changed. Rewriting the system prompt on every change would have invalidated the provider's prompt cache for the whole conversation each time a child started, settled or asked a question. The terminal hides these messages.
9
+ - **Dependencies across worktrees**: every worktree starts at `HEAD`, and merging waits until every task is complete. A dependent task's child therefore first applies its dependencies' verified diffs from the worktree paths the board recorded. It then commits them as a baseline on its detached HEAD, which never reaches a branch. At the end the main agent merges complete tasks in dependency order with `git apply --3way`, so each task contributes only its own changes. The result is left staged and uncommitted. Merging waits for the whole board because a new worktree needs a clean main workspace.
10
+ - **`/delegate-dashboard` (new)**: a popup kanban with Pending, Running, Verifying and Complete columns, divided by vertical rules.
11
+ - Every task is its own bordered card in its column's colour, with a status glyph, id, child name and title. `▲` marks high priority and `▼` low.
12
+ - A blocked card is grey with a hollow `◌` and names what it waits on. A child waiting on the main agent has an amber card with a `?` badge and leads its column.
13
+ - The title row carries a child-slot meter and completion progress. It refreshes every second, and Esc or q closes it.
14
+ - On a short terminal every card folds to one line so more fit, and a narrow terminal stacks the columns. English and Chinese strings are included; other interface languages fall back to English.
15
+ - **Welcome snowflake (redrawn)**: the header mark is now generated from snowflake geometry. Six arms sit 60° apart around a bright hexagonal crystal, each with one branch pair parallel to its neighbours. The 30° arms are smoothed so they read as single lines. Both sizes stay mirror-symmetric, and the core → arms → branches ripple is unchanged.
16
+
17
+ Verification completed before tagging: `npm run check` passed on macOS (lint, both typechecks, 572 unit tests at 84.23% measured `.mjs` line coverage, the nine native Harness integration probes, both package tarballs and 51 evaluations). After that run, one sentence was added to the `/delegate` protocol text (the main agent tells a dependent child that its worktree-local baseline commit is authorised), and the affected suites and lint were rerun. The new behaviour has unit cases for the cap boundaries at both efforts, the `/delegate` preconditions and its notice-form message, and board transitions. They also cover persistence, dependency resolution, cycles, launch refusal, priority inheritance, released dependents, the injected board messages (including that an unchanged board is not re-sent) and the dashboard rendered through Ink at wide, short and narrow sizes. The worktree merge recipe, including a dependent task's baseline commit and dependency-order merging, was exercised against real Git repositories.
18
+
19
+ What has no automated case here: no model was driven through `/delegate`, so whether a model follows the coordinator protocol end to end — planning dependencies, dispatching in order, verifying before completing, merging in order — is unverified. The interactive TUI was not driven by hand; the dashboard and the snowflake were checked as rendered frames rather than in a live terminal. The dashboard stays within the shared half-screen panel height.
@@ -0,0 +1,14 @@
1
+ # DSCODE 0.7.31
2
+
3
+ This release adds OpenCode Go as a fourth provider: `/provider opencode-go` runs a session on an OpenCode Go subscription, serving its chat-completions models with the reasoning efforts each one accepts, and searching the web through Exa as OpenCode itself does.
4
+
5
+ - **`opencode-go` route (new)**: a new plugin, `plugins/opencode-go`, registers the route. `/provider opencode-go` (also `/provider opencode`) asks for the key from the OpenCode console and stores it in `~/.dscode/credentials.yaml` like the other provider keys. `OPENCODE_API_KEY` in the environment takes precedence. The key is sent as a bearer token to `https://opencode.ai/zen/go/v1/chat/completions`. The provider picker, `/login opencode-go` and `/model` pick it up from the provider catalog without terminal changes. Switching from DeepSeek or OpenRouter lands on the same model when Go serves it; otherwise the switch lands on `kimi-k3`.
6
+ - **A catalog probed against the live gateway (design)**: Go's `/models` listing returns ids only. It gives no context size, image support or reasoning controls. Go also passes request fields through to each model's upstream, so what a request may contain differs by model. The catalog therefore records, per model, what the gateway accepted in September 2026. It covers the `reasoning_effort` values (GLM, Kimi K2.7 Code, LongCat and Space Bunny cannot switch thinking off, and MiMo V2.6 refuses `max`) and whether the model takes images (a text-only model answers an image with HTTP 404). Context windows follow each lab's published figure. The catalog has 19 models: DeepSeek V4 (4), GLM (4), Kimi (3), MiMo (4), LongCat, Hy (2) and Space Bunny Free. The DeepSeek rows follow DeepSeek's own API rather than a probe, because the test workspace was not set to Go's Global region.
7
+ - **Request shape**: the body keeps to OpenAI fields: `reasoning_effort` (Off sends `none`, Ultra sends `max` plus the collaboration policy) and `stream_options.include_usage`. It omits OpenRouter's extensions (`reasoning: {effort}`, `provider`, `session_id`), which Go's upstreams reject with "Extra inputs are not permitted". Each request carries the session id in `x-opencode-session` and a `dscode/<version>` user agent, as Go asks of third-party clients. Reasoning goes back to the model that produced it as `reasoning_content`. DeepSeek gets an empty one after another model's turn, because it rejects a thinking-mode tool-call turn without one.
8
+ - **Shared request loop (changed)**: the Go adapter extends the OpenRouter adapter instead of copying it. The request loop, image preparation, SSE parsing and stream translation are now parameterised by route. The route supplies its model lookup, body, headers, replay kind and the name used in error messages. OpenRouter's defaults are unchanged, and its tests pass unmodified.
9
+ - **Web search through Exa (new)**: Go has no search endpoint. A Go session's `web_search` therefore calls `web_search_exa` on Exa's hosted MCP server (`https://mcp.exa.ai/mcp`), which is what OpenCode's own client does, and that server answers without a key. An `EXA_API_KEY` in the environment or the credential store moves the calls onto that account, and a key store that cannot be read falls back to the keyless endpoint. Exa's text answer is parsed into de-duplicated sources with title and snippet. A search times out after 25 seconds, and cancellation is honoured. Routing sends only `opencode-go` sessions to Exa, because the keyless tier is Exa's free offer with no published limit. DeepSeek, OpenRouter and Grok sessions search as before.
10
+ - **Where it stops**: Go serves Qwen and MiniMax over the Anthropic messages protocol, and Grok 4.x, GPT Luna and Muse Spark over the OpenAI responses protocol. This release implements neither. Naming one of those models fails before any request with a message that names the endpoint. The footer shows no cost and no balance on this route, because Go publishes no allowance API. When the workspace is not in the Global region, Go refuses its DeepSeek models; the error now adds where to change that in the OpenCode console.
11
+
12
+ Verification: `npm run check` passed on macOS. That covers lint, both typechecks, 581 unit tests at 84.54% measured `.mjs` line coverage (nine tests are new for this route), the nine native Harness integration probes, both package tarballs and 51 evaluations. The extended `scripts/verify-login-runtime.mjs` probe boots a real Harness Host twice and checks that the `opencode-go` row saves its key, keeps it across a restart, lists the catalog with the right efforts and sends the expected request shape. With a real Go key, the adapter completed a tool call followed by a replayed answer on all 15 non-DeepSeek chat models. The DeepSeek and Qwen rows failed with their intended explanations. A live keyless Exa search returned titled, de-duplicated sources, and a cancelled search reported `WEB_ABORTED`.
13
+
14
+ What has no automated case: the DeepSeek rows were not exercised against Go, because the test workspace was not in the Global region. Image input was checked with direct gateway requests, not through the adapter's attachment path. The provider picker and `/login opencode-go` were not driven by hand in a live terminal. No model ran `web_search` inside a real Go session; routing to Exa is covered by unit cases only.
@@ -0,0 +1,14 @@
1
+ # DSCODE 0.7.32
2
+
3
+ This release makes an OpenCode account login the only way into OpenCode Go and shows the subscription's usage in the footer. `/opencode login` runs the OpenCode console's device login, and the console API key that 0.7.31 introduced is no longer read.
4
+
5
+ - **`/opencode [login|cancel|logout]` (new)**: `login` asks the OpenCode console for a device code, opens the verification page in the browser, and answers at once with the code and the URL. It then keeps polling in the background, because a command settles with one result and cannot print while it waits. It handles `authorization_pending`, `slow_down` (five seconds more per answer) and transient gateway errors until the code expires, which is ten minutes. `/opencode` reports the stored login (account, organisation, days left), an attempt still waiting (its code and URL again), or how the last attempt ended. `cancel` stops the polling. `logout` removes the local login and the cached usage, and says plainly that the token stays valid on OpenCode until it expires or is revoked in the console. The strings are translated into all six interface languages.
6
+ - **The OpenCode CLI's login client (design)**: the console answers the device flow for the public client `opencode-cli`, which is OpenCode's own CLI. DSCODE uses that client id, so the consent page names the OpenCode CLI. The command says so before the browser opens. The guide says OpenCode can restrict the client at any time, and that the route stops working if it does.
7
+ - **The account's own endpoint**: the access token is refused on the public `zen/go/v1` endpoint (HTTP 401, with or without an org header). The console's `/api/config` names an inference endpoint for `opencode-go` per organisation, and that endpoint takes the token as a bearer plus `x-opencode-org-id`. At login DSCODE reads `/api/user` and `/api/orgs`, then takes the first organisation by name whose config carries `opencode-go`, and stores its endpoint with the grant. An account without Go in any organisation fails the login with that reason. The OpenRouter adapter's request loop gained a `resolveAuth` hook that returns the bearer, the base URL and extra headers; OpenRouter's own default is unchanged, and the Go adapter returns the login.
8
+ - **API key route removed (changed)**: the Go route's credential reference is now the login itself (`OPENCODE_OAUTH`). The credential store describes it as read-only, so no key form is ever offered. The provider catalog marks the route with the command that sets it up. `/provider opencode-go` before signing in, and `/login opencode-go`, now show `OpenCode Go is not signed in; run /opencode login first` instead of opening a key field. The picker shows `signed in` or `not signed in · /opencode login`. A request made while signed out fails with the same instruction. An `OPENCODE_API_KEY` saved under 0.7.31 stays in `~/.dscode/credentials.yaml` but is no longer read, and the route's `apiKeyEnv` and `baseURL` settings are gone.
9
+ - **Renewal with rotating refresh tokens**: tokens last 30 days, and a request made within five minutes of expiry refreshes first. Every refresh returns a new refresh token and voids the old one; the probe confirmed this, since reusing the old token answers `invalid_grant`. So the new pair is written back at once, and one process runs one refresh at a time. When a refresh is refused, the store is read again before giving up, because another DSCODE session sharing the store may have rotated it already. Only when nothing newer is stored does the request fail, as `AUTH` with a message asking for `/opencode login`. DSCODE keeps its own grant and never touches an OpenCode CLI login, which would have its refresh token voided the same way.
10
+ - **Subscription usage in the footer (new)**: Go caps usage per rolling five hours, per week and per month. The console's own proxy maps the public `/zen/go/v1/usage` to `/go/v1/usage` on the inference service. There, the account token plus `x-opencode-org-id` answers all three windows, each with a used percentage, `ok` or `rate-limited`, and the reset time. Without the org header the endpoint answers 403. The plugin reads it once a minute while signed in, and right after a login. It keeps the last good snapshot through a failed read, and writes the snapshot to `DSH_HOME` for the terminal process, as the Grok window does. On this route the money slot shows `Go · 5h 12% · 7d 3% · 30d 1%`. An exhausted window is marked `!`, and the slot adds `limited until MM-DD HH:MM`, the latest reset among the exhausted windows. An unread snapshot shows `Go` alone. The endpoint is undocumented, so every field is optional and a changed shape reads as unavailable.
11
+
12
+ Verification: `npm run check` passed on macOS. That covers lint, both typechecks, 586 unit tests at 85.08% measured `.mjs` line coverage, the nine native Harness integration probes, both package tarballs and 51 evaluations. The unit tests drive the device login against a fake console through pending, slow-down and gateway errors, organisation selection and the refusal paths. They cover the grant session's refresh near expiry, one shared refresh for concurrent requests, adopting another process's rotation, and a revoked login. They also cover the command's background sign-in, status, cancel and logout, and requests going to the login's endpoint with its org header. They check that the store describes the login as a read-only credential, and they exercise the usage URL, parsing, caching, file snapshot, sign-out clearing and the footer fact. `scripts/verify-login-runtime.mjs` checks, in a real Harness Host, that the Go row is a read-only credential and that a signed-out request names `/opencode login`. It then stores a synthetic login and checks that the row reads as signed in and that the next request goes to the login's endpoint with its bearer and org. Against the real console, DSCODE's login code signed in with a real account. It ran a kimi-k3 tool call and replay, then forced a refresh; both tokens changed and the next request answered. With a later login, the account token read the usage endpoint at `/inference/go/v1/usage` (200 with the org header, 403 without, 401 on the public endpoint).
13
+
14
+ What has no automated case: `/opencode` was not typed into a live terminal; the command was driven through its handler. The footer was checked as a rendered string, not in a running terminal, and the usage refresh loop was not observed against the real endpoint inside the plugin; the endpoint itself was read by a probe. A refresh racing between two real processes was exercised only against the fake console. An account with several organisations holding Go was not available.
@@ -0,0 +1,30 @@
1
+ # DSCODE 0.7.33
2
+
3
+ This release candidate packages DSCODE for official Harness Desktop, adds community plugin discovery through our Plugin Hub, and establishes a separate Desktop publication path alongside the terminal release.
4
+
5
+ - **Formal Desktop plugin:** `@toddzheng024/dscode-desktop` has an icon, English/Chinese display metadata, package-specific instructions and an exact Harness peer version. It adds coding, browser preview, collaboration, memory, email and opt-in scheduling to the official application. The qualified target is macOS Apple Silicon with Harness runtime `0.2.0-rc.2`. Other runtime candidates remain private. A standalone application, DMG and automatic Desktop updates are deferred.
6
+ - **Plugin Hub:** native Settings and read-only conversation tools share the Hub API and schema. Search, categories, numbered pagination and details expose compatibility and reported security information. Installation requires an exact npm version, official inspection and explicit confirmation. New plugins remain disabled, and the UI opens official management for enabling, configuration and removal. Git-only entries remain visible without installation; Hub Profile application and rollback are outside this integration. A reported scan result is not a guarantee about plugin behavior.
7
+ - **Installation and migration:** official Add plugin accepts the archive, followed by Enable now. Users of the earlier private probe remove its old package name before installing the formal package, because both register the same components. The migration check verifies preserved sessions, credentials, configuration and user patches; keep a backup for your own state. Ordinary same-name replacement, incompatible-update refusal, removal and reinstallation have separate lifecycle checks.
8
+ - **Reproducible distribution steps:** an independent Desktop runtime builds a public candidate, then the exact archive is unpacked and exercised through native Host startup/restart and browser probes. Publication verifies its checksums, version, compatibility and qualification receipt, publishes with the npm `preview` tag, synchronizes the Hub and checks the served public bytes. GitHub assets include the archive, checksum, installation README and release notes. Public availability is established by successful publication and registry verification, not by a local build.
9
+ - **Browser and model workflows:** this version includes the browser and custom-provider work accumulated since 0.7.32. Browser access uses site and Developer grants, document-bound WebMCP discovery, explicit handoff and retained tabs. Desktop previews keep annotation drafts across navigation and permission changes while rejecting expired or replaced documents. Custom services support Chat Completions, Responses and Anthropic Messages, optional images, manual model limits and cancellable discovery/tests. The detailed fixes and boundaries are recorded in the [changelog](../CHANGELOG.md).
10
+
11
+ Verification: `npm run check` passed on the release implementation (1,067
12
+ unit/component cases, 79.99% full-source line coverage, both TypeScript checks,
13
+ native integration, package checks and 63 eval cases). The subsequent native
14
+ installation gate has a separate six-case archive/receipt test suite, which
15
+ also passed, along with documentation checks and lint. The public 0.7.33
16
+ candidate passed independent Harness 0.2.0-rc.2 Host startup/restart, real Chrome
17
+ screenshot/annotation and permission persistence checks. A fresh profile
18
+ installed that archive through the native package manager, verified its locked
19
+ integrity and booted the installed Host with a resolved DSCODE preset and
20
+ working Hub RPC.
21
+
22
+ The official macOS application separately installed and enabled the private
23
+ formal archive, and its Hub installed `dsh-theme-plugin@0.3.3` disabled and
24
+ opened official management. A native lifecycle check migrated the old probe
25
+ name and preserved state. Those rendered GUI/migration observations used the
26
+ private 0.7.32 candidate. Public npm publication and the post-publication
27
+ installation check remain pending; the retained local receipts do not prove
28
+ that users can already download this version from the registry.
29
+
30
+ Unverified paths: real-model task quality, native Computer Use screenshot/input with macOS Accessibility permission, other OS/architecture/runtime combinations, and third-party plugin behavior after enabling. General remote HTTP MCP retains separate runtime compatibility/security work. Scripted model fixtures and browser probes do not establish live model quality. Demo preparation is deferred until distribution is ready.
@@ -0,0 +1,16 @@
1
+ # DSCODE 0.7.4
2
+
3
+ This release fixes an approval problem the evaluation exposed: under `danger-full-access` every MCP call needing approval was silently denied, and `dscode exec --approve-all` could not let it through either.
4
+
5
+ - **MCP calls work again under `danger-full-access`**: automatic review turns every MCP call other than the read-only Chrome methods into one needing approval, regardless of the current permission preset. `danger-full-access` has the `never` approval strategy, and the approval service denies outright before any `approval/request` handler runs, so MCP calls in the TUI were silently denied and the allowance from `dscode exec --approve-all` never got its turn (in the evaluation the denial and the call landed in the same millisecond). A `never` strategy no longer intercepts MCP calls; presets with an `ask` strategy such as `auto` and `ask` still send MCP calls through review or a question as before.
6
+
7
+ Exit DSCODE sessions using the same data directory before upgrading:
8
+
9
+ ```sh
10
+ npm install -g @toddzheng024/dscode@0.7.4
11
+ dscode update 0.7.4
12
+ ```
13
+
14
+ `dscode-0.7.4.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
15
+
16
+ Verification covers unit, integration, TUI, package build and the coverage baseline. New here: unit tests that automatic review still requires approval for an MCP call under the `ask` strategy and allows it directly under `never`, with confirmation that the test fails once the fix is removed. An MCP call was not made inside a real `dscode exec --permission danger-full-access --approve-all` session.
@@ -0,0 +1,18 @@
1
+ # DSCODE 0.7.5
2
+
3
+ This release makes review work in a non-Git workspace. In the evaluation `/app` was not a Git repository, so the model never received a hint to call review, and the review tool there only returned `no_repository`.
4
+
5
+ - **A non-Git workspace also gets the review hint and a diff**: before a task's first tool call, dscode snapshots the workspace into a tree inside a shadow bare repository under `DSH_HOME/review-baselines` (the workspace itself is untouched); at review time it snapshots again and diffs against the baseline for the independent review. The model can only change files through tools, so what is captured at that moment is the pre-task state. Such a workspace gets its own hint explaining that the review covers changes since the task began. `path` may narrow the range, while `staged`, `base` and `commit` still need Git.
6
+ - **Snapshot scope and limits**: it skips `.git`, `node_modules`, virtual environments and cache directories, the sensitive files review skips anyway (`.env`, keys and so on) and files over 4 MiB, and the workspace's `.gitignore` applies too; a change to those files is not reviewed. A workspace over 20,000 files or 256 MiB is not snapshotted, and review returns `no_baseline` with a hint not to call it again.
7
+ - **The baseline follows the task**: the baseline is one ref per session and survives a resume; starting a new task in the same session replaces the old baseline. Without a git executable the behaviour is unchanged: no hint is injected and review returns `no_repository`.
8
+
9
+ Exit DSCODE sessions using the same data directory before upgrading:
10
+
11
+ ```sh
12
+ npm install -g @toddzheng024/dscode@0.7.5
13
+ dscode update 0.7.5
14
+ ```
15
+
16
+ `dscode-0.7.5.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
17
+
18
+ Verification covers unit, integration, TUI, package build and the coverage baseline. New here: the snapshot diff includes modified and added files, excludes ignored directories/sensitive files/large files, narrows by `path`, errors on a Git scope, reads the baseline back through a new store instance, lets a new task replace the baseline, and returns `no_baseline` over the limits; plus an end-to-end test where the pre-tool-call hook establishes the baseline and the review tool then reviews the change. Whether a model follows the hint and calls review was not confirmed in a real model session.
@@ -0,0 +1,29 @@
1
+ # DSCODE 0.7.6
2
+
3
+ This release expands OpenRouter from three DeepSeek models to pi-ai's whole OpenRouter catalogue, and fixes several things that stopped a non-DeepSeek model from working or made it worse: effort hard-coded to the DeepSeek bands, delegation available only under Ultra, and cost and cache-hit rate that could not be computed. The review output ceiling is no longer squeezed so low either.
4
+
5
+ - **OpenRouter lists the whole catalogue**: the configuration `/provider openrouter` writes no longer lists 3 DeepSeek models but every OpenRouter model in the pi-ai catalogue (366, including Anthropic, OpenAI, Google, Qwen, Kimi, GLM and more), without adding one by id by hand. The three DeepSeek models still use the official off/low/high/max bands and Ultra through `modelOverrides`, while the other models use their own reasoning bands and protocols (Claude goes through `anthropic-messages`). A narrow configuration written by 0.7.3–0.7.5 is replaced automatically when `/model` is opened or the provider is switched; a configuration the user edited is left alone.
6
+ - **`/model` can search**: press `/` or Ctrl+F to start searching, and every word typed has to match a provider or a model name; while searching, `q`, `r` and `g` are only text, Esc exits and clears, and ↑↓ and Enter work as usual.
7
+ - **OpenRouter cost is computed from live prices**: with an OpenRouter key configured, prices are read from OpenRouter's public model list (no key needed) and cached in the data directory for a day, including the cache-write price and the long-prompt tiers; a model without a separate cache read/write price is charged at the input price. A failed read keeps the previous prices, and the DeepSeek models still have a fixed price fallback.
8
+ - **Fix: the cache-hit rate was always `--` on OpenRouter**: pi-ai reports that number only when there was a cache read, and one call without the field made the whole session's rate unknown; a missing value now counts as 0.
9
+ - **Effort follows the model**: the configured default `high` falls back to the model's own default when unsupported, so a model without reasoning (such as qwen3-coder or kimi-k2) no longer errors every turn. Session cards, `/doctor`, memory and review under Ultra request the supported band closest to the wanted one and pass nothing when the model has no bands; the memory configuration accepts every standard band name. `dscode exec --effort` accepts `minimal`, `medium` and `xhigh` and validates them against the model before starting. A child agent's effort text is no longer hard-coded to low/high/max, and `/status` no longer shows xhigh for a non-DeepSeek model.
10
+ - **Delegation at any effort**: `subagent` and `subagent_fork` are no longer available only under Ultra, so a model without a `max` band (and therefore without Ultra) can delegate too. Below Ultra the prompt controls it: do the work yourself by default, delegate only a larger independent part or a wide read-only investigation that would crowd the context, at most one child at a time, at the lowest suitable band the model supports. Ultra keeps its original collaboration policy; `workflow` and `ralph` remain unavailable, and the three-child concurrency cap applies at every effort.
11
+ - **The review output ceiling is loosened**: it no longer caps at 8192 output tokens but uses the model route's default ceiling (256k for DeepSeek, the model's own in the OpenRouter catalogue); the timeout goes from 90 seconds to 10 minutes, and the report handed back to the agent keeps at most 64,000 characters.
12
+
13
+ Exit DSCODE sessions using the same data directory before upgrading:
14
+
15
+ ```sh
16
+ npm install -g @toddzheng024/dscode@0.7.6
17
+ dscode update 0.7.6
18
+ ```
19
+
20
+ `dscode-0.7.6.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
21
+
22
+ Verification covers unit, integration, TUI, package build and the coverage baseline. New here:
23
+ - In a real Host, the OpenRouter route lists more than 300 models, the DeepSeek models keep the official bands and GPT-5 uses its own; the narrow configuration from 0.7.3–0.7.5 is read back in the shape the settings service actually returns, confirming it is recognised and replaced.
24
+ - Requests are intercepted before they go out: qwen3-coder carries no reasoning parameters under the default `high`; a below-Ultra request carries `subagent`; `exec --effort medium` is rejected on DeepSeek Flash and lists the available bands.
25
+ - The real Ink `/model` panel is rendered to verify search filtering, `q` not closing the panel while searching, Esc clearing, and Enter selecting.
26
+ - Price parsing is checked against a real snapshot of the OpenRouter model list (442 priced models), with tests for tiered prices, cache writes, the one-day cache and an offline restart.
27
+ - Patch upgrade tests: a dependency carrying the old patch migrates to the new delegation filtering and child-effort text, and applying it again produces no change.
28
+
29
+ Not done: no non-DeepSeek model was called with a real OpenRouter key; the real effect of the below-Ultra delegation prompt has not been evaluated.
@@ -0,0 +1,36 @@
1
+ # DSCODE 0.7.7
2
+
3
+ This release replaces pi-ai with DSCODE's own adapter for OpenRouter and closes the gaps found after 0.7.6: an upstream error returned in the stream was not retried, the actual charge was computed inaccurately, web search could only go through DeepSeek, and session titles and automatic approval often failed on a reasoning model. It also improves the compaction display and thresholds and the `/provider` and `/model` interaction.
4
+
5
+ - **OpenRouter gets its own adapter**: it calls OpenRouter's chat completions directly, and the model list, context windows, reasoning bands and prices all come from OpenRouter's live `/api/v1/models`, cached in the data directory for a day, so a new model needs no release; the first model query waits at most 10 seconds. DeepSeek, GLM, Kimi and Qwen are adapted and tested, and other tool-calling models work on a best-effort basis. Each model uses its own reasoning bands: DeepSeek V4 keeps the official off/low/high/max, a model supporting max additionally offers Ultra, and reasoning content is passed back verbatim through `reasoning_details`.
6
+ - **Routing is left to OpenRouter**: every request carries `session_id`, so one session stays on one upstream as far as possible and keeps its cache; only providers that support all request parameters and are not fp4-quantised are chosen (Kimi's native INT4 is kept). Qwen gets explicit cache breakpoints on the system message and the latest user message.
7
+ - **Errors follow OpenRouter's error codes**: an upstream error returned in the stream (such as 502) is retried, 429 reads `Retry-After`, 402 is recognised as insufficient credit, and an over-long context triggers a compaction and retry.
8
+ - **Accounting follows the actual charge**: session cost uses the `usage.cost` OpenRouter returns (including BYOK fees and the different upstream prices), falling back to a price-table estimate only when it is unavailable.
9
+ - **Web search follows the provider**: an OpenRouter session searches through OpenRouter's web plugin (Exa), while a DeepSeek session still uses DeepSeek; a user with only an OpenRouter key can search too.
10
+ - **`/openrouter` account panel**: it shows the account balance, the current key's allowance and today's/this week's/this month's spend; with a management key configured it also shows the usage of every API key and the spend of the last 30 days by model and by actual provider. After `/provider openrouter` or `/login openrouter` saves an API key it offers an optional management-key step, validated against OpenRouter before saving and used for reading only. The footer balance reads the account balance and falls back to the key's remaining allowance when the key is refused.
11
+ - **Compaction display and thresholds**: while compaction runs it shows a self-playing Tetris animation and "compacting the context, please wait" (following `/language`). The automatic compaction threshold is banded by the ratio of a model's cache-read price to its input price: below 0.1 it compacts at 90%, below 0.5 at 80%, otherwise at 60%; an unavailable price keeps 80%, and an explicitly configured threshold wins. Switching to a model in `/model` that would trigger a compaction asks for confirmation first.
12
+ - **`/model` searches directly**: typing immediately after opening searches, every character re-ranks with BM25 (model name weighted highest, then id and provider), and the word being typed is matched as a prefix. A search change does not focus, Enter or an arrow key focuses the first result, and Enter while focused selects it; Esc clears the search first and then closes, Tab opens the provider settings, and retry moved to Ctrl+R.
13
+ - **Slash menu**: pressing Enter on `/provider`, `/login` or `/openrouter` in the menu opens the matching panel directly, with no second press.
14
+ - **Titles and automatic approval**: generating a title on OpenRouter uses the lowest reasoning strength the model supports, and the title output ceiling went from 64 to 1024; the automatic-approval self-check now requests low strength and its output ceiling went from 768 to 4096.
15
+ - **Migration**: an OpenRouter configuration an older version wrote under `llm-pi-ai` is cleared automatically and the pi-ai route is no longer loaded; reasoning content in a session from the pi-ai era still passes back.
16
+
17
+ Exit DSCODE sessions using the same data directory before upgrading:
18
+
19
+ ```sh
20
+ npm install -g @toddzheng024/dscode@0.7.7
21
+ dscode update 0.7.7
22
+ ```
23
+
24
+ `dscode-0.7.7.tar.gz` can also be downloaded from GitHub Releases to install the standalone source package; the two installation forms use different data directories and never migrate sessions or credentials automatically.
25
+
26
+ Verification covers unit, the coverage baseline, eval, integration, TUI and package build. New here:
27
+ - Real OpenRouter key calls to DeepSeek V4 Flash, GLM 5.3 Flash, Kimi K2.6, Qwen 3.8 27B, Muse Spark 1.3 and Muse Spark 1.3 Contributor: tool calls, a continued turn with reasoning content passed back, a cache hit on a repeated prefix, the actual charge, and a title request; GLM reasoning pass-back was verified pinned to Z.AI; plus the error for an invalid model and OpenRouter web search.
28
+ - Real Ink rendering: the compaction animation at various widths, the model-switch confirmation, the `/openrouter` panel and management-key input, `/model` direct search and its focus rules, and the slash-menu Enter.
29
+ - Real account reads: an ordinary key reads the account balance; an ordinary key is refused by management-key validation.
30
+ - Offline login verification: in a real Host the OpenRouter route lists models from the cached model list with the correct bands, and the request body is intercepted before the network call.
31
+
32
+ Not done / known limits:
33
+ - The explicit cache breakpoints for Alibaba-hosted Qwen could not be measured (the account's zero-data-retention setting blocks those endpoints).
34
+ - All-key usage and 30-day spend under a management key were verified with simulated data only, with no real management key.
35
+ - Claude, GPT and Gemini are best-effort support, and Anthropic models no longer get automatic cache breakpoints the way pi-ai gave them.
36
+ - A cache hit depends on the upstream provider OpenRouter picks for the session.
@@ -0,0 +1,14 @@
1
+ # DSCODE 0.7.8
2
+
3
+ This release fixes the experience of a long task reviewing repeatedly and expanding the work after its checks already passed, and tunes local session data handling.
4
+
5
+ - Automatic code review is capped at two rounds per user task, 90 seconds per round, 8,192 output tokens per model request, at low reasoning effort. Changing path, failing, or resuming a session does not hand back the full budget; the second round focuses on the issues already fixed and their direct regressions. An unfinished review is never reported as passing, and the user can still run `/review` by hand.
6
+ - The default agent rules ask for a statement before starting, an update on a key discovery, and, in a long task, ordinary prose progress roughly every minute. Non-verbose mode shows these too; a blocking tool can delay an update, and whether the model follows this still needs verification on real tasks.
7
+ - State the task scope and acceptance criteria, verify a review finding before acting on it, and run the affected checks after a fix. Once the checks pass, move to delivery instead of expanding into optional optimization again.
8
+ - Session metrics gained a bounded incremental read cache and a footer computation cache, and handle a final line without a newline correctly. Session cards reuse the content summary, and the memory job avoids large array spreads.
9
+ - The mailbox gained historical retention and per-recipient event cleanup while keeping undelivered messages; tests use their own small limits instead of writing 50,000 rows.
10
+ - OpenRouter empty SSE data is filtered and a corrupt cache re-read is throttled; plus build import-path validation, decoupling of the shared patch helpers, backoff for the macOS stdin probe and migration of older patches.
11
+
12
+ This release does not upgrade the upstream DSH dependencies.
13
+
14
+ Verification: `npm run check` passes (226 unit tests, 44 evaluation tests; 80.08% complete-source coverage; integration, the real Ink UI and the package checks pass). How a real model performs at progress communication and task convergence still needs validation in real use.
@@ -0,0 +1,15 @@
1
+ # DSCODE 0.7.9
2
+
3
+ This release makes `dscode update` update a whole installation in one step: a tar installation gains in-place self-upgrade, and the npm/Hub launcher replaces its own binary; it also adopts ESLint 10 and fixes a batch of problems in the review allowlist and error handling.
4
+
5
+ - A tar installation gains `dscode update [exact version]`: it downloads the tarball from GitHub Releases and verifies it against the publisher's sha256 digest (a release without a digest is refused), migrates `.runtime`, `.env` and the local config (a newer default file shipped by the release is not overwritten by the old copy), and swaps the directory in place — the `dscode` command path does not change and needs no relinking; the old installation is kept as a sibling backup directory to switch back to or discard by hand. A source checkout refuses and asks for a git pull; a running session refuses the update, and the check is repeated before the directory swap.
6
+ - For an npm/Hub installation, `dscode update` first replaces the global launcher itself with npm at the target version and only then moves the profile to the same version, so a failure in either step leaves no half-updated state; with no version it asks npm for the latest launcher and updates both when there is a newer one, falling back to the current launcher's recommended version when the registry is unreachable, never tracking latest implicitly.
7
+ - The repository adopts `npm run lint` (ESLint 10 flat config), included in `npm run check`; template files serialised into the TUI such as `*-panel.mjs` are exempted the way they are bound.
8
+ - The automatic-review escalation allowlist is tightened: `sysctl -w`, assignment-form keys, and `hostname`/`date` with an argument are no longer granted automatically, so a state-mutating diagnostic goes back to a human confirmation.
9
+ - When code review collects untracked files, a file that vanished or is unreadable counts as omitted instead of failing the whole review; a corrupt line in the review audit file is skipped instead of breaking every later approval.
10
+ - A failed session-bridge recovery now fails closed for that step only and is retried by the next step, instead of permanently wedging that session's reception.
11
+ - The email store and the verification scripts no longer throw inside `finally` (a cleanup failure cannot hide a successful result or the original error); the checks report an integrity violation and a suite failure together; six `catch` blocks gained an error cause.
12
+
13
+ This release does not upgrade the upstream DSH dependencies.
14
+
15
+ Verification: `npm run check` passes (243 unit tests, 44 evaluation tests; 80.29% complete-source coverage; integration, the real Ink UI and the package checks pass). Tar self-upgrade ships with the package from this release; an older tar installation still needs one manual directory swap. The session race window during an update is narrowed to seconds but not eliminated (no kernel lock is shared with a running session).