@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,537 @@
1
+ // DSCODE user-interface strings. English is the default; /language switches
2
+ // between the supported locales and the choice is stored per machine in
3
+ // ~/.dsh/dsh-code/language.json (DSCODE_LANGUAGE overrides it for one process).
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
5
+ import { homedir } from 'node:os';
6
+ import { join } from 'node:path';
7
+
8
+ export const LANGUAGES = [
9
+ { code: 'en', name: 'English' },
10
+ { code: 'zh-CN', name: '简体中文' },
11
+ { code: 'zh-TW', name: '繁體中文' },
12
+ { code: 'ja', name: '日本語' },
13
+ { code: 'ko', name: '한국어' },
14
+ { code: 'es', name: 'Español' },
15
+ ];
16
+
17
+ export const ALIASES = {
18
+ en: ['en', 'english', 'eng', '英文', '英语', '英語'],
19
+ 'zh-CN': ['zh-cn', 'zh', 'zh-hans', 'zhhans', 'cn', 'chinese', 'simplified', '中文', '简体', '简体中文', '简中', '中文简体'],
20
+ 'zh-TW': ['zh-tw', 'zh-hant', 'zhhant', 'tw', 'hk', 'zh-hk', 'traditional', '繁体', '繁體', '繁體中文', '繁体中文', '繁中'],
21
+ ja: ['ja', 'jp', 'japanese', '日本語', '日语', '日語'],
22
+ ko: ['ko', 'kr', 'korean', '한국어', '韩语', '韓語', '韓文'],
23
+ es: ['es', 'spanish', 'español', 'espanol', '西班牙语', '西班牙語'],
24
+ };
25
+
26
+ export const MESSAGES = {
27
+ en: {
28
+ 'activity.replying': 'Replying', 'activity.thinking': 'Thinking', 'activity.running': 'Running',
29
+ 'communication.sending': 'sending to {peer}', 'communication.waiting': 'waiting for {peer}',
30
+ 'activity.turn': 'this turn', 'activity.interrupt': 'Esc to interrupt',
31
+ 'agents.running': 'running', 'agents.idle': 'idle', 'agents.done': 'done', 'agents.total': 'total',
32
+ 'welcome.model': 'model', 'welcome.effort': 'effort', 'welcome.project': 'project',
33
+ 'verbose.on': 'verbose on: thinking and tool calls are shown in the chat', 'verbose.off': 'verbose off',
34
+ 'mouse.on': 'mouse on: the wheel scrolls the chat · hold Shift while dragging to select text (Option in iTerm2, Fn in Terminal)',
35
+ 'mouse.off': 'mouse off: select and copy freely · PageUp/PageDown scroll the chat · /mouse turns wheel scrolling on',
36
+ 'language.current': 'Language: {name} · /language en | zh-CN | zh-TW | ja | ko | es',
37
+ 'update.available': 'DSCODE {version} is available · run /update to upgrade',
38
+ 'update.newest': 'the newest release',
39
+ 'update.scheduled': 'DSCODE {version} will update after this session exits.\nLog: {log}',
40
+ 'update.usage': 'Usage: /update [exact-version]',
41
+ 'language.set': 'language → {name}', 'language.title': '/language — interface language', 'language.currentMark': 'current', 'language.unknown': 'Unknown language "{value}". Choose en, zh-CN, zh-TW, ja, ko or es.',
42
+ 'language.saveFailed': 'language save failed: {error}',
43
+ 'doctor.logs.new': 'Only warnings/errors since this TUI version started are recorded.',
44
+ 'footer.average': 'avg', 'footer.context': 'ctx', 'footer.cache': 'cache', 'footer.grokUsed': 'used', 'footer.grokResets': 'resets', 'footer.goLimited': 'limited until', 'composer.placeholder': 'type a message', 'composer.shellMode': '! shell mode · esc exits',
45
+ 'compaction.running': 'Compacting context, please wait', 'compaction.confirm.title': 'Switching to {model} will compact the conversation',
46
+ 'compaction.confirm.usage': 'context {used} ≥ compaction threshold {threshold} ({window} × {ratio})', 'compaction.confirm.next': 'the next step compacts older history first',
47
+ 'compaction.confirm.overflow': 'it already exceeds the {window} window: the next request compacts and retries', 'compaction.confirm.hint': 'y switch · n/esc back',
48
+ 'budget.confirm.title': 'Session spend {spent} has reached the {limit} budget ({percent})', 'budget.confirm.spent': 'the session has already recorded {spent} of the {limit} limit ({percent})', 'budget.confirm.next': 'confirming runs the next turn anyway; Esc or n cancels it', 'budget.confirm.hint': 'y send anyway · n/esc cancel',
49
+ 'doctor.nearTimeout': 'Assessment: {count} Bash calls ended at about 300 seconds, which matches the tool timeout; traces alone cannot prove the root cause. Next, check those calls\' shell completion markers and terminal errors.',
50
+ 'doctor.logs.none': 'No log file yet; earlier console logs were not persisted and cannot be recovered.',
51
+ 'doctor.evidence': 'Diagnostic evidence: {traces} recent sessions, {logs} warnings/errors.',
52
+ 'doctor.noFindings': 'No clear timeouts, unfinished tool calls or error events in recent traces.',
53
+ 'doctor.noRoute': 'No model route is available, so the model analysis could not run.',
54
+ 'doctor.scope': 'Evidence scope: {traces} recent sessions, {logs} warnings/errors; conversation text, tool arguments and tool output were not read.',
55
+ 'doctor.failed': 'Model analysis did not finish: {error}.',
56
+ 'account.signedIn': 'DeepSeek account: signed in on this machine (the stored grant is not re-checked here).',
57
+ 'account.signedOut': 'DeepSeek account: signed out. The DeepSeek route falls back to an API key.',
58
+ 'account.profile': 'Identity: {identity}',
59
+ 'account.profileFailed': 'Identity: could not be read just now.',
60
+ 'account.unknownIdentity': 'no display name',
61
+ 'account.balance': 'Balance: {wallets}',
62
+ 'account.bonus': 'bonus {wallets}',
63
+ 'account.balanceFailed': 'Balance: could not be read just now.',
64
+ 'account.balanceEmpty': 'Balance: no wallet reported.',
65
+ 'account.attempt': 'Last sign-in: {phase}',
66
+ 'account.attemptFailed': 'Last sign-in: {phase} ({reason})',
67
+ 'account.phase.initializing': 'starting',
68
+ 'account.phase.waiting-browser': 'waiting for the browser',
69
+ 'account.phase.exchanging': 'exchanging the code',
70
+ 'account.phase.committing': 'saving the grant',
71
+ 'account.phase.succeeded': 'signed in',
72
+ 'account.phase.cancelled': 'cancelled',
73
+ 'account.phase.expired': 'expired',
74
+ 'account.phase.failed': 'failed',
75
+ 'account.error.network': 'the platform could not be reached',
76
+ 'account.error.protocol': 'the platform answered unexpectedly',
77
+ 'account.error.expired': 'the attempt timed out',
78
+ 'account.error.storage': 'the credential store refused the grant',
79
+ 'account.links': 'Usage: {usage} · Top-up: {topUp}',
80
+ 'account.hintSignedIn': '/account logout signs out on this machine.',
81
+ 'account.hintSignedOut': '/account login opens the browser to sign in.',
82
+ 'account.unavailable': 'This deployment composes no DeepSeek account service.',
83
+ 'account.noCallback': 'Account login needs the loopback callback server; it is disabled (DSCODE_ACCOUNT_LOGIN=0).',
84
+ 'account.usage': 'Usage: /account [login|cancel|logout]',
85
+ 'account.startFailed': 'The sign-in did not start.',
86
+ 'account.nothingToCancel': 'No sign-in is in progress.',
87
+ 'account.starting': 'Signing in to DeepSeek through the browser…',
88
+ 'account.browserOpened': 'The browser was opened. Finish the sign-in there; it lands back on this machine.',
89
+ 'account.browserManual': 'Open this URL to finish the sign-in:',
90
+ 'opencode.usage': 'Usage: /opencode [login|cancel|logout]',
91
+ 'opencode.signedIn': 'OpenCode Go: signed in as {who}; the login renews itself (current token valid {days} more days).',
92
+ 'opencode.signedOut': 'OpenCode Go: not signed in. /opencode login signs in with your OpenCode account.',
93
+ 'opencode.pending': 'Waiting for approval of code {code} at:',
94
+ 'opencode.started': 'Approve code {code} in the browser to sign in to OpenCode Go (the page names the OpenCode CLI, whose login DSCODE uses). It keeps waiting in the background for up to {minutes} minutes; /opencode shows the result.',
95
+ 'opencode.browserOpened': 'The browser was opened. If it did not, open:',
96
+ 'opencode.browserManual': 'Open this URL:',
97
+ 'opencode.succeeded': 'Signed in to OpenCode Go as {who}. /provider opencode-go uses it.',
98
+ 'opencode.failed': 'The last OpenCode Go sign-in did not complete: {reason}',
99
+ 'opencode.cancelled': 'The OpenCode Go sign-in was cancelled.',
100
+ 'opencode.nothingToCancel': 'No OpenCode Go sign-in is in progress.',
101
+ 'opencode.loggedOut': 'Removed the OpenCode Go login from this machine. The token stays valid on OpenCode until it expires; revoke it in the OpenCode console to end it now.',
102
+ 'opencode.startFailed': 'The OpenCode Go sign-in did not start: {reason}',
103
+ 'opencode.unavailable': 'OpenCode Go sign-in needs the credential store, which this profile does not provide.',
104
+ },
105
+ 'zh-CN': {
106
+ 'activity.replying': '正在回复', 'activity.thinking': '正在思考', 'activity.running': '正在执行',
107
+ 'communication.sending': '正在向 {peer} 发送', 'communication.waiting': '正在等待 {peer} 回应',
108
+ 'activity.turn': '本轮', 'activity.interrupt': 'Esc 中断',
109
+ 'agents.running': '运行中', 'agents.idle': '空闲', 'agents.done': '已完成', 'agents.total': '总计',
110
+ 'welcome.model': '模型', 'welcome.effort': '推理', 'welcome.project': '项目',
111
+ 'verbose.on': '详细模式已开启:对话中显示思考与工具调用', 'verbose.off': '详细模式已关闭',
112
+ 'mouse.on': '鼠标捕获已开启:滚轮滚动对话 · 拖选文本时按住 Shift(iTerm2 按住 Option、Terminal 按住 Fn)',
113
+ 'mouse.off': '鼠标捕获已关闭:可自由选择复制 · PageUp/PageDown 滚动对话 · /mouse 重新开启',
114
+ 'language.current': '语言:{name} · /language en | zh-CN | zh-TW | ja | ko | es',
115
+ 'update.available': 'DSCODE {version} 已发布 · 输入 /update 升级',
116
+ 'update.newest': '最新版本',
117
+ 'update.scheduled': 'DSCODE {version} 将在本次会话退出后升级。\n日志:{log}',
118
+ 'update.usage': '用法:/update [精确版本号]',
119
+ 'language.set': '语言 → {name}', 'language.title': '/language — 界面语言', 'language.currentMark': '当前', 'language.unknown': '未知语言 "{value}"。可选 en、zh-CN、zh-TW、ja、ko、es。',
120
+ 'language.saveFailed': '语言设置保存失败:{error}',
121
+ 'doctor.logs.new': '仅记录新版 TUI 启动后的 warning/error。',
122
+ 'footer.average': '平均', 'footer.context': 'ctx', 'footer.cache': '缓存', 'footer.grokUsed': '已用', 'footer.grokResets': '重置', 'footer.goLimited': '受限至', 'composer.placeholder': '输入消息', 'composer.shellMode': '! shell 模式 · esc 退出',
123
+ 'compaction.running': '正在压缩上下文,请稍后', 'compaction.confirm.title': '切换到 {model} 会触发自动压缩',
124
+ 'compaction.confirm.usage': '当前上下文 {used} ≥ 压缩阈值 {threshold}({window} × {ratio})', 'compaction.confirm.next': '下一步开始前会先压缩较早的对话',
125
+ 'compaction.confirm.overflow': '已超出新模型的 {window} 上下文窗口:下一次请求会先压缩再重试', 'compaction.confirm.hint': 'y 确认切换 · n/esc 返回',
126
+ 'budget.confirm.title': '会话花费 {spent} 已达预算 {limit}({percent})', 'budget.confirm.spent': '本会话已记录 {spent} / 上限 {limit}({percent})', 'budget.confirm.next': '确认后仍会执行下一轮;esc 或 n 取消', 'budget.confirm.hint': 'y 仍然发送 · n/esc 取消',
127
+ 'doctor.nearTimeout': '判断:{count} 次 Bash 调用在约 300 秒结束,符合工具超时特征;trace 不能单独证明触发超时的根因。下一步检查这些调用的 shell 完成标记和终端错误。',
128
+ 'doctor.logs.none': '日志文件尚未建立;旧版控制台日志未持久化,无法回溯。',
129
+ 'doctor.evidence': '诊断证据:{traces} 个近期会话、{logs} 条 warning/error。',
130
+ 'doctor.noFindings': '近期 trace 中未发现明确的超时、未完成工具调用或错误事件。',
131
+ 'doctor.noRoute': '没有可用的模型路由,无法运行模型分析。',
132
+ 'doctor.scope': '证据范围:{traces} 个近期会话、{logs} 条 warning/error;未读取对话正文、工具参数或工具输出。',
133
+ 'doctor.failed': '模型分析未完成:{error}。',
134
+ 'account.signedIn': 'DeepSeek 账号:本机已登录(此处不重新校验凭据是否仍被服务端接受)。',
135
+ 'account.signedOut': 'DeepSeek 账号:未登录。DeepSeek 路由将回退到 API key。',
136
+ 'account.profile': '身份:{identity}',
137
+ 'account.profileFailed': '身份:暂时读取失败。',
138
+ 'account.unknownIdentity': '无显示名',
139
+ 'account.balance': '余额:{wallets}',
140
+ 'account.bonus': '赠额 {wallets}',
141
+ 'account.balanceFailed': '余额:暂时读取失败。',
142
+ 'account.balanceEmpty': '余额:未返回任何钱包。',
143
+ 'account.attempt': '最近一次登录:{phase}',
144
+ 'account.attemptFailed': '最近一次登录:{phase}({reason})',
145
+ 'account.phase.initializing': '正在开始',
146
+ 'account.phase.waiting-browser': '等待浏览器',
147
+ 'account.phase.exchanging': '正在兑换授权码',
148
+ 'account.phase.committing': '正在保存凭据',
149
+ 'account.phase.succeeded': '已登录',
150
+ 'account.phase.cancelled': '已取消',
151
+ 'account.phase.expired': '已过期',
152
+ 'account.phase.failed': '失败',
153
+ 'account.error.network': '无法连接平台',
154
+ 'account.error.protocol': '平台返回异常',
155
+ 'account.error.expired': '尝试超时',
156
+ 'account.error.storage': '凭据存储拒绝写入',
157
+ 'account.links': '用量:{usage} · 充值:{topUp}',
158
+ 'account.hintSignedIn': '/account logout 在本机退出登录。',
159
+ 'account.hintSignedOut': '/account login 打开浏览器登录。',
160
+ 'account.unavailable': '当前部署没有挂载 DeepSeek 账号服务。',
161
+ 'account.noCallback': '账号登录需要回环回调服务,它已被关闭(DSCODE_ACCOUNT_LOGIN=0)。',
162
+ 'account.usage': '用法:/account [login|cancel|logout]',
163
+ 'account.startFailed': '登录没有启动。',
164
+ 'account.nothingToCancel': '当前没有正在进行的登录。',
165
+ 'account.starting': '正在通过浏览器登录 DeepSeek……',
166
+ 'account.browserOpened': '已打开浏览器,请在那里完成登录,完成后会回到本机。',
167
+ 'account.browserManual': '打开这个地址完成登录:',
168
+ 'opencode.usage': '用法:/opencode [login|cancel|logout]',
169
+ 'opencode.signedIn': 'OpenCode Go:已登录为 {who};登录会自动续期(当前 token 还剩 {days} 天)。',
170
+ 'opencode.signedOut': 'OpenCode Go:未登录。用 /opencode login 登录你的 OpenCode 账号。',
171
+ 'opencode.pending': '正在等待批准验证码 {code},地址:',
172
+ 'opencode.started': '请在浏览器中批准验证码 {code} 以登录 OpenCode Go(页面显示的是 OpenCode CLI,DSCODE 使用它的登录)。后台最多等待 {minutes} 分钟;/opencode 可查看结果。',
173
+ 'opencode.browserOpened': '已打开浏览器。如果没有打开,请访问:',
174
+ 'opencode.browserManual': '请打开这个地址:',
175
+ 'opencode.succeeded': '已登录 OpenCode Go:{who}。/provider opencode-go 会使用这个登录。',
176
+ 'opencode.failed': '上一次 OpenCode Go 登录没有完成:{reason}',
177
+ 'opencode.cancelled': '已取消 OpenCode Go 登录。',
178
+ 'opencode.nothingToCancel': '当前没有进行中的 OpenCode Go 登录。',
179
+ 'opencode.loggedOut': '已从本机移除 OpenCode Go 登录。token 在 OpenCode 那边到期前仍然有效;如需立即失效,请在 OpenCode 控制台撤销。',
180
+ 'opencode.startFailed': 'OpenCode Go 登录没有开始:{reason}',
181
+ 'opencode.unavailable': 'OpenCode Go 登录需要凭据存储,当前配置没有提供。',
182
+ },
183
+ 'zh-TW': {
184
+ 'activity.replying': '正在回覆', 'activity.thinking': '正在思考', 'activity.running': '正在執行',
185
+ 'communication.sending': '正在向 {peer} 傳送', 'communication.waiting': '正在等待 {peer} 回覆',
186
+ 'activity.turn': '本輪', 'activity.interrupt': 'Esc 中斷',
187
+ 'agents.running': '執行中', 'agents.idle': '閒置', 'agents.done': '已完成', 'agents.total': '總計',
188
+ 'welcome.model': '模型', 'welcome.effort': '推理', 'welcome.project': '專案',
189
+ 'verbose.on': '詳細模式已開啟:對話中顯示思考與工具呼叫', 'verbose.off': '詳細模式已關閉',
190
+ 'mouse.on': '滑鼠擷取已開啟:滾輪捲動對話 · 拖選文字時按住 Shift(iTerm2 按住 Option、Terminal 按住 Fn)',
191
+ 'mouse.off': '滑鼠擷取已關閉:可自由選取複製 · PageUp/PageDown 捲動對話 · /mouse 重新開啟',
192
+ 'language.current': '語言:{name} · /language en | zh-CN | zh-TW | ja | ko | es',
193
+ 'update.available': 'DSCODE {version} 已發布 · 輸入 /update 升級',
194
+ 'update.newest': '最新版本',
195
+ 'update.scheduled': 'DSCODE {version} 將在本次工作階段結束後升級。\n日誌:{log}',
196
+ 'update.usage': '用法:/update [精確版本號]',
197
+ 'language.set': '語言 → {name}', 'language.title': '/language — 介面語言', 'language.currentMark': '目前', 'language.unknown': '未知語言 "{value}"。可選 en、zh-CN、zh-TW、ja、ko、es。',
198
+ 'language.saveFailed': '語言設定儲存失敗:{error}',
199
+ 'doctor.logs.new': '僅記錄新版 TUI 啟動後的 warning/error。',
200
+ 'footer.average': '平均', 'footer.context': 'ctx', 'footer.cache': '快取', 'footer.grokUsed': '已用', 'footer.grokResets': '重置', 'footer.goLimited': '受限至', 'composer.placeholder': '輸入訊息', 'composer.shellMode': '! shell 模式 · esc 離開',
201
+ 'compaction.running': '正在壓縮上下文,請稍候', 'compaction.confirm.title': '切換到 {model} 會觸發自動壓縮',
202
+ 'compaction.confirm.usage': '目前上下文 {used} ≥ 壓縮閾值 {threshold}({window} × {ratio})', 'compaction.confirm.next': '下一步開始前會先壓縮較早的對話',
203
+ 'compaction.confirm.overflow': '已超出新模型的 {window} 上下文視窗:下一次請求會先壓縮再重試', 'compaction.confirm.hint': 'y 確認切換 · n/esc 返回',
204
+ 'budget.confirm.title': '工作階段花費 {spent} 已達預算 {limit}({percent})', 'budget.confirm.spent': '本工作階段已記錄 {spent} / 上限 {limit}({percent})', 'budget.confirm.next': '確認後仍會執行下一輪;esc 或 n 取消', 'budget.confirm.hint': 'y 仍然送出 · n/esc 取消',
205
+ 'doctor.nearTimeout': '判斷:{count} 次 Bash 呼叫在約 300 秒結束,符合工具逾時特徵;trace 無法單獨證明觸發逾時的根因。下一步檢查這些呼叫的 shell 完成標記和終端錯誤。',
206
+ 'doctor.logs.none': '日誌檔尚未建立;舊版主控台日誌未持久化,無法回溯。',
207
+ 'doctor.evidence': '診斷證據:{traces} 個近期工作階段、{logs} 筆 warning/error。',
208
+ 'doctor.noFindings': '近期 trace 中未發現明確的逾時、未完成工具呼叫或錯誤事件。',
209
+ 'doctor.noRoute': '沒有可用的模型路由,無法執行模型分析。',
210
+ 'doctor.scope': '證據範圍:{traces} 個近期工作階段、{logs} 筆 warning/error;未讀取對話內容、工具參數或工具輸出。',
211
+ 'doctor.failed': '模型分析未完成:{error}。',
212
+ 'account.signedIn': 'DeepSeek 帳號:本機已登入(此處不重新驗證憑證是否仍被服務端接受)。',
213
+ 'account.signedOut': 'DeepSeek 帳號:未登入。DeepSeek 路由將回退到 API key。',
214
+ 'account.profile': '身分:{identity}',
215
+ 'account.profileFailed': '身分:暫時讀取失敗。',
216
+ 'account.unknownIdentity': '無顯示名稱',
217
+ 'account.balance': '餘額:{wallets}',
218
+ 'account.bonus': '贈額 {wallets}',
219
+ 'account.balanceFailed': '餘額:暫時讀取失敗。',
220
+ 'account.balanceEmpty': '餘額:未回傳任何錢包。',
221
+ 'account.attempt': '最近一次登入:{phase}',
222
+ 'account.attemptFailed': '最近一次登入:{phase}({reason})',
223
+ 'account.phase.initializing': '正在開始',
224
+ 'account.phase.waiting-browser': '等待瀏覽器',
225
+ 'account.phase.exchanging': '正在兌換授權碼',
226
+ 'account.phase.committing': '正在儲存憑證',
227
+ 'account.phase.succeeded': '已登入',
228
+ 'account.phase.cancelled': '已取消',
229
+ 'account.phase.expired': '已過期',
230
+ 'account.phase.failed': '失敗',
231
+ 'account.error.network': '無法連線平台',
232
+ 'account.error.protocol': '平台回應異常',
233
+ 'account.error.expired': '嘗試逾時',
234
+ 'account.error.storage': '憑證儲存拒絕寫入',
235
+ 'account.links': '用量:{usage} · 充值:{topUp}',
236
+ 'account.hintSignedIn': '/account logout 在本機登出。',
237
+ 'account.hintSignedOut': '/account login 開啟瀏覽器登入。',
238
+ 'account.unavailable': '目前部署沒有掛載 DeepSeek 帳號服務。',
239
+ 'account.noCallback': '帳號登入需要回環回呼服務,它已被關閉(DSCODE_ACCOUNT_LOGIN=0)。',
240
+ 'account.usage': '用法:/account [login|cancel|logout]',
241
+ 'account.startFailed': '登入沒有啟動。',
242
+ 'account.nothingToCancel': '目前沒有進行中的登入。',
243
+ 'account.starting': '正在透過瀏覽器登入 DeepSeek……',
244
+ 'account.browserOpened': '已開啟瀏覽器,請在那裡完成登入,完成後會回到本機。',
245
+ 'account.browserManual': '開啟這個網址完成登入:',
246
+ 'opencode.usage': '用法:/opencode [login|cancel|logout]',
247
+ 'opencode.signedIn': 'OpenCode Go:已登入為 {who};登入會自動續期(目前 token 還剩 {days} 天)。',
248
+ 'opencode.signedOut': 'OpenCode Go:尚未登入。用 /opencode login 登入你的 OpenCode 帳號。',
249
+ 'opencode.pending': '正在等待核准驗證碼 {code},網址:',
250
+ 'opencode.started': '請在瀏覽器中核准驗證碼 {code} 以登入 OpenCode Go(頁面顯示的是 OpenCode CLI,DSCODE 使用它的登入)。背景最多等待 {minutes} 分鐘;/opencode 可查看結果。',
251
+ 'opencode.browserOpened': '已開啟瀏覽器。如果沒有開啟,請前往:',
252
+ 'opencode.browserManual': '請開啟這個網址:',
253
+ 'opencode.succeeded': '已登入 OpenCode Go:{who}。/provider opencode-go 會使用這個登入。',
254
+ 'opencode.failed': '上一次 OpenCode Go 登入沒有完成:{reason}',
255
+ 'opencode.cancelled': '已取消 OpenCode Go 登入。',
256
+ 'opencode.nothingToCancel': '目前沒有進行中的 OpenCode Go 登入。',
257
+ 'opencode.loggedOut': '已從本機移除 OpenCode Go 登入。token 在 OpenCode 那邊到期前仍然有效;如需立即失效,請在 OpenCode 控制台撤銷。',
258
+ 'opencode.startFailed': 'OpenCode Go 登入沒有開始:{reason}',
259
+ 'opencode.unavailable': 'OpenCode Go 登入需要憑證儲存,目前設定沒有提供。',
260
+ },
261
+ ja: {
262
+ 'activity.replying': '応答中', 'activity.thinking': '思考中', 'activity.running': '実行中',
263
+ 'communication.sending': '{peer} へ送信中', 'communication.waiting': '{peer} の応答を待機中',
264
+ 'activity.turn': '今回のターン', 'activity.interrupt': 'Esc で中断',
265
+ 'agents.running': '実行中', 'agents.idle': '待機中', 'agents.done': '完了', 'agents.total': '合計',
266
+ 'welcome.model': 'モデル', 'welcome.effort': '推論', 'welcome.project': 'プロジェクト',
267
+ 'verbose.on': '詳細モード オン:思考とツール呼び出しをチャットに表示します', 'verbose.off': '詳細モード オフ',
268
+ 'mouse.on': 'マウス キャプチャ オン:ホイールでチャットをスクロール · Shift(iTerm2 は Option、Terminal は Fn)を押しながらドラッグでテキスト選択',
269
+ 'mouse.off': 'マウス キャプチャ オフ:自由に選択・コピーできます · PageUp/PageDown でスクロール · /mouse で再びオン',
270
+ 'language.current': '言語:{name} · /language en | zh-CN | zh-TW | ja | ko | es',
271
+ 'update.available': 'DSCODE {version} が公開されました · /update でアップグレード',
272
+ 'update.newest': '最新リリース',
273
+ 'update.scheduled': 'DSCODE {version} はこのセッションの終了後に更新されます。\nログ: {log}',
274
+ 'update.usage': '使用法: /update [正確なバージョン]',
275
+ 'language.set': '言語 → {name}', 'language.title': '/language — 表示言語', 'language.currentMark': '現在', 'language.unknown': '不明な言語 "{value}"。en、zh-CN、zh-TW、ja、ko、es から選んでください。',
276
+ 'language.saveFailed': '言語設定の保存に失敗しました:{error}',
277
+ 'doctor.logs.new': 'この TUI バージョンの起動以降の warning/error のみ記録されています。',
278
+ 'footer.average': '平均', 'footer.context': 'ctx', 'footer.cache': 'キャッシュ', 'footer.grokUsed': '使用', 'footer.grokResets': 'リセット', 'footer.goLimited': '制限解除', 'composer.placeholder': 'メッセージを入力', 'composer.shellMode': '! shell モード · esc で終了',
279
+ 'compaction.running': 'コンテキストを圧縮しています。しばらくお待ちください', 'compaction.confirm.title': '{model} に切り替えると自動圧縮が実行されます',
280
+ 'compaction.confirm.usage': '現在のコンテキスト {used} ≥ 圧縮しきい値 {threshold}({window} × {ratio})', 'compaction.confirm.next': '次のステップの前に古い履歴を圧縮します',
281
+ 'compaction.confirm.overflow': '新しいモデルの {window} ウィンドウを超えています。次のリクエストで圧縮して再試行します', 'compaction.confirm.hint': 'y 切り替え · n/esc 戻る',
282
+ 'budget.confirm.title': 'セッションの支出 {spent} が予算 {limit} に達しました({percent})', 'budget.confirm.spent': 'このセッションは {spent} / 上限 {limit}({percent})を記録済みです', 'budget.confirm.next': '確認すると次のターンを実行します。esc または n で中止', 'budget.confirm.hint': 'y 送信 · n/esc 中止',
283
+ 'doctor.nearTimeout': '判断:Bash 呼び出し {count} 件が約 300 秒で終了しており、ツールのタイムアウトの特徴に一致します。トレースだけでは根本原因を証明できません。次はこれらの呼び出しのシェル完了マーカーと端末エラーを確認してください。',
284
+ 'doctor.logs.none': 'ログファイルはまだありません。以前のコンソールログは保存されておらず、遡れません。',
285
+ 'doctor.evidence': '診断の根拠:直近のセッション {traces} 件、warning/error {logs} 件。',
286
+ 'doctor.noFindings': '直近のトレースに明確なタイムアウト、未完了ツール、停滞は見つかりませんでした。',
287
+ 'doctor.noRoute': '利用できるモデルルートがないため、モデル分析を実行できません。',
288
+ 'doctor.scope': '根拠の範囲:直近のセッション {traces} 件、warning/error {logs} 件。会話本文、ツール引数、ツール出力は読んでいません。',
289
+ 'doctor.failed': 'モデル分析が完了しませんでした:{error}。',
290
+ 'account.signedIn': 'DeepSeek アカウント:このマシンでサインイン済み(保存済み認可の有効性はここでは再確認しません)。',
291
+ 'account.signedOut': 'DeepSeek アカウント:サインアウト。DeepSeek ルートは API キーにフォールバックします。',
292
+ 'account.profile': 'アカウント:{identity}',
293
+ 'account.profileFailed': 'アカウント:今は取得できませんでした。',
294
+ 'account.unknownIdentity': '表示名なし',
295
+ 'account.balance': '残高:{wallets}',
296
+ 'account.bonus': 'ボーナス {wallets}',
297
+ 'account.balanceFailed': '残高:今は取得できませんでした。',
298
+ 'account.balanceEmpty': '残高:ウォレットの報告がありません。',
299
+ 'account.attempt': '直近のサインイン:{phase}',
300
+ 'account.attemptFailed': '直近のサインイン:{phase}({reason})',
301
+ 'account.phase.initializing': '開始中',
302
+ 'account.phase.waiting-browser': 'ブラウザ待ち',
303
+ 'account.phase.exchanging': 'コード交換中',
304
+ 'account.phase.committing': '認可を保存中',
305
+ 'account.phase.succeeded': 'サインイン済み',
306
+ 'account.phase.cancelled': 'キャンセル',
307
+ 'account.phase.expired': '期限切れ',
308
+ 'account.phase.failed': '失敗',
309
+ 'account.error.network': 'プラットフォームに接続できません',
310
+ 'account.error.protocol': 'プラットフォームの応答が不正です',
311
+ 'account.error.expired': 'タイムアウトしました',
312
+ 'account.error.storage': '認証情報ストアが保存を拒否しました',
313
+ 'account.links': '使用量:{usage} · チャージ:{topUp}',
314
+ 'account.hintSignedIn': '/account logout でこのマシンからサインアウトします。',
315
+ 'account.hintSignedOut': '/account login でブラウザを開いてサインインします。',
316
+ 'account.unavailable': 'この構成には DeepSeek アカウントサービスがありません。',
317
+ 'account.noCallback': 'アカウントサインインにはループバックのコールバックサーバーが必要ですが、無効です(DSCODE_ACCOUNT_LOGIN=0)。',
318
+ 'account.usage': '使い方:/account [login|cancel|logout]',
319
+ 'account.startFailed': 'サインインを開始できませんでした。',
320
+ 'account.nothingToCancel': '進行中のサインインはありません。',
321
+ 'account.starting': 'ブラウザで DeepSeek にサインインしています……',
322
+ 'account.browserOpened': 'ブラウザを開きました。そこでサインインを完了すると、このマシンに戻ります。',
323
+ 'account.browserManual': 'この URL を開いてサインインを完了してください:',
324
+ 'opencode.usage': '使い方:/opencode [login|cancel|logout]',
325
+ 'opencode.signedIn': 'OpenCode Go:{who} としてサインイン中。ログインは自動で更新されます(現在のトークンは残り {days} 日)。',
326
+ 'opencode.signedOut': 'OpenCode Go:サインインしていません。/opencode login で OpenCode アカウントにサインインしてください。',
327
+ 'opencode.pending': 'コード {code} の承認を待っています:',
328
+ 'opencode.started': 'ブラウザでコード {code} を承認して OpenCode Go にサインインしてください(ページには OpenCode CLI と表示されます。DSCODE はそのログインを使います)。最大 {minutes} 分間バックグラウンドで待ちます。結果は /opencode で確認できます。',
329
+ 'opencode.browserOpened': 'ブラウザを開きました。開かない場合はこちら:',
330
+ 'opencode.browserManual': 'この URL を開いてください:',
331
+ 'opencode.succeeded': 'OpenCode Go に {who} としてサインインしました。/provider opencode-go で使われます。',
332
+ 'opencode.failed': '前回の OpenCode Go サインインは完了しませんでした:{reason}',
333
+ 'opencode.cancelled': 'OpenCode Go のサインインをキャンセルしました。',
334
+ 'opencode.nothingToCancel': '進行中の OpenCode Go サインインはありません。',
335
+ 'opencode.loggedOut': 'このマシンから OpenCode Go のログインを削除しました。トークンは期限まで OpenCode 側で有効です。すぐに無効にするには OpenCode コンソールで取り消してください。',
336
+ 'opencode.startFailed': 'OpenCode Go のサインインを開始できませんでした:{reason}',
337
+ 'opencode.unavailable': 'OpenCode Go のサインインには資格情報ストアが必要ですが、このプロファイルにはありません。',
338
+ },
339
+ ko: {
340
+ 'activity.replying': '응답 중', 'activity.thinking': '생각 중', 'activity.running': '실행 중',
341
+ 'communication.sending': '{peer}에게 전송 중', 'communication.waiting': '{peer}의 응답을 기다리는 중',
342
+ 'activity.turn': '이번 턴', 'activity.interrupt': 'Esc 중단',
343
+ 'agents.running': '실행 중', 'agents.idle': '대기', 'agents.done': '완료', 'agents.total': '전체',
344
+ 'welcome.model': '모델', 'welcome.effort': '추론', 'welcome.project': '프로젝트',
345
+ 'verbose.on': '상세 모드 켜짐: 생각과 도구 호출을 채팅에 표시합니다', 'verbose.off': '상세 모드 꺼짐',
346
+ 'mouse.on': '마우스 캡처 켜짐: 휠로 채팅 스크롤 · Shift(iTerm2는 Option, Terminal은 Fn)를 누른 채 드래그하여 텍스트 선택',
347
+ 'mouse.off': '마우스 캡처 꺼짐: 자유롭게 선택·복사 · PageUp/PageDown으로 채팅 스크롤 · /mouse로 다시 켜기',
348
+ 'language.current': '언어: {name} · /language en | zh-CN | zh-TW | ja | ko | es',
349
+ 'update.available': 'DSCODE {version} 사용 가능 · /update 로 업그레이드',
350
+ 'update.newest': '최신 릴리스',
351
+ 'update.scheduled': 'DSCODE {version} 은(는) 이 세션이 종료된 후 업데이트됩니다.\n로그: {log}',
352
+ 'update.usage': '사용법: /update [정확한 버전]',
353
+ 'language.set': '언어 → {name}', 'language.title': '/language — 인터페이스 언어', 'language.currentMark': '현재', 'language.unknown': '알 수 없는 언어 "{value}". en, zh-CN, zh-TW, ja, ko, es 중에서 선택하세요.',
354
+ 'language.saveFailed': '언어 설정 저장 실패: {error}',
355
+ 'doctor.logs.new': '이 TUI 버전 시작 이후의 warning/error만 기록됩니다.',
356
+ 'footer.average': '평균', 'footer.context': 'ctx', 'footer.cache': '캐시', 'footer.grokUsed': '사용', 'footer.grokResets': '재설정', 'footer.goLimited': '제한 해제', 'composer.placeholder': '메시지를 입력하세요', 'composer.shellMode': '! shell 모드 · esc 종료',
357
+ 'compaction.running': '컨텍스트를 압축하는 중입니다. 잠시만 기다려 주세요', 'compaction.confirm.title': '{model}(으)로 전환하면 자동 압축이 실행됩니다',
358
+ 'compaction.confirm.usage': '현재 컨텍스트 {used} ≥ 압축 임계값 {threshold} ({window} × {ratio})', 'compaction.confirm.next': '다음 단계 전에 이전 대화를 먼저 압축합니다',
359
+ 'compaction.confirm.overflow': '새 모델의 {window} 창을 이미 넘었습니다. 다음 요청에서 압축한 뒤 재시도합니다', 'compaction.confirm.hint': 'y 전환 · n/esc 뒤로',
360
+ 'budget.confirm.title': '세션 지출 {spent}이(가) 예산 {limit}에 도달했습니다({percent})', 'budget.confirm.spent': '이 세션은 {spent} / 한도 {limit}({percent})을 기록했습니다', 'budget.confirm.next': '확인하면 다음 턴을 계속 실행합니다. esc 또는 n으로 취소', 'budget.confirm.hint': 'y 그래도 전송 · n/esc 취소',
361
+ 'doctor.nearTimeout': '판단: Bash 호출 {count}건이 약 300초에 종료되어 도구 시간 초과 특징과 일치합니다. 트레이스만으로는 근본 원인을 증명할 수 없습니다. 다음으로 해당 호출의 셸 완료 표시와 터미널 오류를 확인하세요.',
362
+ 'doctor.logs.none': '아직 로그 파일이 없습니다. 이전 콘솔 로그는 저장되지 않아 복구할 수 없습니다.',
363
+ 'doctor.evidence': '진단 근거: 최근 세션 {traces}개, warning/error {logs}건.',
364
+ 'doctor.noFindings': '최근 트레이스에서 명확한 시간 초과, 미완료 도구, 정지는 발견되지 않았습니다.',
365
+ 'doctor.noRoute': '사용 가능한 모델 경로가 없어 모델 분석을 실행할 수 없습니다.',
366
+ 'doctor.scope': '근거 범위: 최근 세션 {traces}개, warning/error {logs}건. 대화 본문, 도구 인수, 도구 출력은 읽지 않았습니다.',
367
+ 'doctor.failed': '모델 분석이 완료되지 않았습니다: {error}.',
368
+ 'account.signedIn': 'DeepSeek 계정: 이 기기에서 로그인됨(저장된 인증이 여전히 유효한지는 여기서 다시 확인하지 않습니다).',
369
+ 'account.signedOut': 'DeepSeek 계정: 로그아웃 상태. DeepSeek 경로는 API 키로 대체됩니다.',
370
+ 'account.profile': '계정: {identity}',
371
+ 'account.profileFailed': '계정: 지금은 읽을 수 없습니다.',
372
+ 'account.unknownIdentity': '표시 이름 없음',
373
+ 'account.balance': '잔액: {wallets}',
374
+ 'account.bonus': '보너스 {wallets}',
375
+ 'account.balanceFailed': '잔액: 지금은 읽을 수 없습니다.',
376
+ 'account.balanceEmpty': '잔액: 보고된 지갑이 없습니다.',
377
+ 'account.attempt': '최근 로그인: {phase}',
378
+ 'account.attemptFailed': '최근 로그인: {phase} ({reason})',
379
+ 'account.phase.initializing': '시작 중',
380
+ 'account.phase.waiting-browser': '브라우저 대기 중',
381
+ 'account.phase.exchanging': '코드 교환 중',
382
+ 'account.phase.committing': '인증 저장 중',
383
+ 'account.phase.succeeded': '로그인됨',
384
+ 'account.phase.cancelled': '취소됨',
385
+ 'account.phase.expired': '만료됨',
386
+ 'account.phase.failed': '실패',
387
+ 'account.error.network': '플랫폼에 연결할 수 없습니다',
388
+ 'account.error.protocol': '플랫폼 응답이 올바르지 않습니다',
389
+ 'account.error.expired': '시간이 초과되었습니다',
390
+ 'account.error.storage': '자격 증명 저장소가 저장을 거부했습니다',
391
+ 'account.links': '사용량: {usage} · 충전: {topUp}',
392
+ 'account.hintSignedIn': '/account logout 으로 이 기기에서 로그아웃합니다.',
393
+ 'account.hintSignedOut': '/account login 으로 브라우저를 열어 로그인합니다.',
394
+ 'account.unavailable': '이 구성에는 DeepSeek 계정 서비스가 없습니다.',
395
+ 'account.noCallback': '계정 로그인에는 루프백 콜백 서버가 필요하지만 비활성화되어 있습니다(DSCODE_ACCOUNT_LOGIN=0).',
396
+ 'account.usage': '사용법: /account [login|cancel|logout]',
397
+ 'account.startFailed': '로그인이 시작되지 않았습니다.',
398
+ 'account.nothingToCancel': '진행 중인 로그인이 없습니다.',
399
+ 'account.starting': '브라우저로 DeepSeek에 로그인하고 있습니다……',
400
+ 'account.browserOpened': '브라우저를 열었습니다. 거기서 로그인을 완료하면 이 기기로 돌아옵니다.',
401
+ 'account.browserManual': '이 URL을 열어 로그인을 완료하세요:',
402
+ 'opencode.usage': '사용법: /opencode [login|cancel|logout]',
403
+ 'opencode.signedIn': 'OpenCode Go: {who}(으)로 로그인됨. 로그인은 자동으로 갱신됩니다(현재 토큰 {days}일 남음).',
404
+ 'opencode.signedOut': 'OpenCode Go: 로그인하지 않았습니다. /opencode login 으로 OpenCode 계정에 로그인하세요.',
405
+ 'opencode.pending': '코드 {code} 승인을 기다리는 중:',
406
+ 'opencode.started': '브라우저에서 코드 {code} 를 승인해 OpenCode Go 에 로그인하세요(페이지에는 OpenCode CLI 로 표시되며, DSCODE 는 그 로그인을 사용합니다). 백그라운드에서 최대 {minutes}분 기다립니다. 결과는 /opencode 에서 확인하세요.',
407
+ 'opencode.browserOpened': '브라우저를 열었습니다. 열리지 않았다면 다음을 여세요:',
408
+ 'opencode.browserManual': '이 URL을 여세요:',
409
+ 'opencode.succeeded': 'OpenCode Go 에 {who}(으)로 로그인했습니다. /provider opencode-go 가 이 로그인을 사용합니다.',
410
+ 'opencode.failed': '지난 OpenCode Go 로그인이 완료되지 않았습니다: {reason}',
411
+ 'opencode.cancelled': 'OpenCode Go 로그인을 취소했습니다.',
412
+ 'opencode.nothingToCancel': '진행 중인 OpenCode Go 로그인이 없습니다.',
413
+ 'opencode.loggedOut': '이 컴퓨터에서 OpenCode Go 로그인을 제거했습니다. 토큰은 만료될 때까지 OpenCode 에서 유효합니다. 즉시 끝내려면 OpenCode 콘솔에서 취소하세요.',
414
+ 'opencode.startFailed': 'OpenCode Go 로그인을 시작하지 못했습니다: {reason}',
415
+ 'opencode.unavailable': 'OpenCode Go 로그인에는 자격 증명 저장소가 필요하지만 이 프로필에는 없습니다.',
416
+ },
417
+ es: {
418
+ 'activity.replying': 'Respondiendo', 'activity.thinking': 'Pensando', 'activity.running': 'Ejecutando',
419
+ 'communication.sending': 'enviando a {peer}', 'communication.waiting': 'esperando a {peer}',
420
+ 'activity.turn': 'este turno', 'activity.interrupt': 'Esc para interrumpir',
421
+ 'agents.running': 'en ejecución', 'agents.idle': 'inactivo', 'agents.done': 'terminado', 'agents.total': 'en total',
422
+ 'welcome.model': 'modelo', 'welcome.effort': 'esfuerzo', 'welcome.project': 'proyecto',
423
+ 'verbose.on': 'modo detallado activado: el razonamiento y las llamadas a herramientas se muestran en el chat', 'verbose.off': 'modo detallado desactivado',
424
+ 'mouse.on': 'ratón activado: la rueda desplaza el chat · mantén Shift al arrastrar para seleccionar texto (Option en iTerm2, Fn en Terminal)',
425
+ 'mouse.off': 'ratón desactivado: selecciona y copia libremente · PageUp/PageDown desplazan el chat · /mouse vuelve a activar la captura',
426
+ 'language.current': 'Idioma: {name} · /language en | zh-CN | zh-TW | ja | ko | es',
427
+ 'update.available': 'DSCODE {version} disponible · ejecuta /update para actualizar',
428
+ 'update.newest': 'la última versión',
429
+ 'update.scheduled': 'DSCODE {version} se actualizará cuando termine esta sesión.\nRegistro: {log}',
430
+ 'update.usage': 'Uso: /update [versión exacta]',
431
+ 'language.set': 'idioma → {name}', 'language.title': '/language — idioma de la interfaz', 'language.currentMark': 'actual', 'language.unknown': 'Idioma desconocido "{value}". Elige en, zh-CN, zh-TW, ja, ko o es.',
432
+ 'language.saveFailed': 'no se pudo guardar el idioma: {error}',
433
+ 'doctor.logs.new': 'Solo se registran los warnings/errores desde que arrancó esta versión del TUI.',
434
+ 'footer.average': 'prom', 'footer.context': 'ctx', 'footer.cache': 'caché', 'footer.grokUsed': 'usado', 'footer.grokResets': 'reinicia', 'footer.goLimited': 'limitado hasta', 'composer.placeholder': 'escribe un mensaje', 'composer.shellMode': '! modo shell · esc sale',
435
+ 'compaction.running': 'Compactando el contexto, espera un momento', 'compaction.confirm.title': 'Cambiar a {model} compactará la conversación',
436
+ 'compaction.confirm.usage': 'contexto {used} ≥ umbral de compactación {threshold} ({window} × {ratio})', 'compaction.confirm.next': 'el siguiente paso compacta antes el historial antiguo',
437
+ 'compaction.confirm.overflow': 'ya supera la ventana de {window}: la siguiente petición compacta y reintenta', 'compaction.confirm.hint': 'y cambiar · n/esc volver',
438
+ 'budget.confirm.title': 'El gasto de la sesión {spent} alcanzó el presupuesto {limit} ({percent})', 'budget.confirm.spent': 'la sesión ya registró {spent} de un límite de {limit} ({percent})', 'budget.confirm.next': 'confirmar ejecuta el siguiente turno igualmente; esc o n lo cancela', 'budget.confirm.hint': 'y enviar igual · n/esc cancelar',
439
+ 'doctor.nearTimeout': 'Valoración: {count} llamadas a Bash terminaron a unos 300 segundos, lo que coincide con el tiempo de espera de la herramienta; las trazas por sí solas no prueban la causa raíz. A continuación, revisa los marcadores de finalización del shell y los errores de terminal de esas llamadas.',
440
+ 'doctor.logs.none': 'Aún no hay archivo de registro; los registros de consola anteriores no se conservaron y no se pueden recuperar.',
441
+ 'doctor.evidence': 'Evidencia del diagnóstico: {traces} sesiones recientes, {logs} warnings/errores.',
442
+ 'doctor.noFindings': 'No hay tiempos de espera, herramientas sin terminar ni bloqueos claros en las trazas recientes.',
443
+ 'doctor.noRoute': 'No hay una ruta de modelo disponible, así que el análisis con modelo no se pudo ejecutar.',
444
+ 'doctor.scope': 'Alcance de la evidencia: {traces} sesiones recientes, {logs} warnings/errores; no se leyó el texto de la conversación, los argumentos ni la salida de las herramientas.',
445
+ 'doctor.failed': 'El análisis con modelo no terminó: {error}.',
446
+ 'account.signedIn': 'Cuenta DeepSeek: sesión iniciada en esta máquina (aquí no se vuelve a comprobar la concesión guardada).',
447
+ 'account.signedOut': 'Cuenta DeepSeek: sin sesión. La ruta DeepSeek recurre a una clave de API.',
448
+ 'account.profile': 'Identidad: {identity}',
449
+ 'account.profileFailed': 'Identidad: no se pudo leer ahora.',
450
+ 'account.unknownIdentity': 'sin nombre visible',
451
+ 'account.balance': 'Saldo: {wallets}',
452
+ 'account.bonus': 'bonificación {wallets}',
453
+ 'account.balanceFailed': 'Saldo: no se pudo leer ahora.',
454
+ 'account.balanceEmpty': 'Saldo: ninguna cartera informada.',
455
+ 'account.attempt': 'Último inicio de sesión: {phase}',
456
+ 'account.attemptFailed': 'Último inicio de sesión: {phase} ({reason})',
457
+ 'account.phase.initializing': 'iniciando',
458
+ 'account.phase.waiting-browser': 'esperando el navegador',
459
+ 'account.phase.exchanging': 'canjeando el código',
460
+ 'account.phase.committing': 'guardando la concesión',
461
+ 'account.phase.succeeded': 'sesión iniciada',
462
+ 'account.phase.cancelled': 'cancelado',
463
+ 'account.phase.expired': 'caducado',
464
+ 'account.phase.failed': 'fallido',
465
+ 'account.error.network': 'no se pudo contactar con la plataforma',
466
+ 'account.error.protocol': 'la plataforma respondió de forma inesperada',
467
+ 'account.error.expired': 'el intento caducó',
468
+ 'account.error.storage': 'el almacén de credenciales rechazó la concesión',
469
+ 'account.links': 'Uso: {usage} · Recarga: {topUp}',
470
+ 'account.hintSignedIn': '/account logout cierra la sesión en esta máquina.',
471
+ 'account.hintSignedOut': '/account login abre el navegador para iniciar sesión.',
472
+ 'account.unavailable': 'Esta composición no incluye el servicio de cuenta DeepSeek.',
473
+ 'account.noCallback': 'El inicio de sesión necesita el servidor de retorno en loopback; está desactivado (DSCODE_ACCOUNT_LOGIN=0).',
474
+ 'account.usage': 'Uso: /account [login|cancel|logout]',
475
+ 'account.startFailed': 'El inicio de sesión no comenzó.',
476
+ 'account.nothingToCancel': 'No hay ningún inicio de sesión en curso.',
477
+ 'account.starting': 'Iniciando sesión en DeepSeek a través del navegador…',
478
+ 'account.browserOpened': 'Se abrió el navegador. Termina ahí el inicio de sesión y volverá a esta máquina.',
479
+ 'account.browserManual': 'Abre esta URL para terminar el inicio de sesión:',
480
+ 'opencode.usage': 'Uso: /opencode [login|cancel|logout]',
481
+ 'opencode.signedIn': 'OpenCode Go: sesión iniciada como {who}; el inicio de sesión se renueva solo (el token actual vale {days} días más).',
482
+ 'opencode.signedOut': 'OpenCode Go: sin sesión. /opencode login inicia sesión con tu cuenta de OpenCode.',
483
+ 'opencode.pending': 'Esperando la aprobación del código {code} en:',
484
+ 'opencode.started': 'Aprueba el código {code} en el navegador para iniciar sesión en OpenCode Go (la página muestra OpenCode CLI, cuyo inicio de sesión usa DSCODE). Espera en segundo plano hasta {minutes} minutos; /opencode muestra el resultado.',
485
+ 'opencode.browserOpened': 'Se abrió el navegador. Si no se abrió, abre:',
486
+ 'opencode.browserManual': 'Abre esta URL:',
487
+ 'opencode.succeeded': 'Sesión iniciada en OpenCode Go como {who}. /provider opencode-go la usa.',
488
+ 'opencode.failed': 'El último inicio de sesión en OpenCode Go no terminó: {reason}',
489
+ 'opencode.cancelled': 'Se canceló el inicio de sesión en OpenCode Go.',
490
+ 'opencode.nothingToCancel': 'No hay ningún inicio de sesión de OpenCode Go en curso.',
491
+ 'opencode.loggedOut': 'Se quitó el inicio de sesión de OpenCode Go de este equipo. El token sigue siendo válido en OpenCode hasta que caduque; revócalo en la consola de OpenCode para terminarlo ya.',
492
+ 'opencode.startFailed': 'No se inició el inicio de sesión en OpenCode Go: {reason}',
493
+ 'opencode.unavailable': 'El inicio de sesión en OpenCode Go necesita el almacén de credenciales, que este perfil no ofrece.',
494
+ },
495
+ };
496
+
497
+ export function normalizeLanguage(value) {
498
+ const wanted = String(value ?? '').trim().toLowerCase().replace(/[_\s]+/g, '-');
499
+ if (!wanted) return null;
500
+ for (const [code, aliases] of Object.entries(ALIASES)) if (aliases.includes(wanted) || code.toLowerCase() === wanted) return code;
501
+ return null;
502
+ }
503
+
504
+ export function languageName(code) {
505
+ return LANGUAGES.find(language => language.code === code)?.name ?? code;
506
+ }
507
+
508
+ export function t(locale, key, params) {
509
+ const table = MESSAGES[locale] ?? MESSAGES.en;
510
+ let text = table[key] ?? MESSAGES.en[key] ?? key;
511
+ if (params) for (const [name, value] of Object.entries(params)) text = text.split(`{${name}}`).join(String(value));
512
+ return text;
513
+ }
514
+
515
+ export function languageFile(home = homedir()) {
516
+ return join(home, '.dsh', 'dsh-code', 'language.json');
517
+ }
518
+
519
+ /** The stored language, or English; DSCODE_LANGUAGE overrides the file for one process. */
520
+ export function readLanguage({ home = homedir(), env = process.env } = {}) {
521
+ const override = normalizeLanguage(env.DSCODE_LANGUAGE);
522
+ if (override) return override;
523
+ try {
524
+ const file = languageFile(home);
525
+ if (!existsSync(file)) return 'en';
526
+ return normalizeLanguage(JSON.parse(readFileSync(file, 'utf8')).language) ?? 'en';
527
+ } catch { return 'en'; }
528
+ }
529
+
530
+ export function saveLanguage(code, { home = homedir() } = {}) {
531
+ const normalized = normalizeLanguage(code);
532
+ if (!normalized) throw new Error(`Unknown language: ${code}`);
533
+ const file = languageFile(home);
534
+ mkdirSync(join(home, '.dsh', 'dsh-code'), { recursive: true });
535
+ writeFileSync(file, JSON.stringify({ language: normalized }, null, 2) + '\n');
536
+ return normalized;
537
+ }