@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,146 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ // dscode: what the Grok subscription left, and when it resets. The CLI proxy answers two
5
+ // payloads on the same credential the models come from: /settings names the tier, and
6
+ // /billing?format=credits carries the weekly window plus the used percentage. The
7
+ // percentage is optional (the server omits it when a period has no usage), so the status
8
+ // line has three states: a number, no usage recorded yet, and unreadable.
9
+ //
10
+ // This is the undocumented rail the official CLI itself reads; every field is optional and
11
+ // a shape change must degrade to "usage unavailable", never to a crash or a wrong number.
12
+
13
+ export const GROK_BILLING_URL = "https://cli-chat-proxy.grok.com/v1/billing?format=credits";
14
+ export const GROK_SETTINGS_URL = "https://cli-chat-proxy.grok.com/v1/settings";
15
+ /** The CLI re-reads its subscription every 60s (`subscription_watch_interval_secs`); so does DSCODE. */
16
+ export const GROK_SUBSCRIPTION_TTL_MS = 60_000;
17
+ const FILE = "grok-subscription.json";
18
+ const VERSION = 1;
19
+ let state;
20
+ let fetchedAt = 0;
21
+ let pending;
22
+ let disk;
23
+
24
+ const finite = value => Number.isFinite(Number(value)) ? Number(value) : undefined;
25
+ const percent = value => {
26
+ const number = finite(value);
27
+ return number === undefined ? undefined : Math.min(100, Math.max(0, number));
28
+ };
29
+ const stamp = value => typeof value === "string" && value.length > 0 ? value : undefined;
30
+
31
+ /**
32
+ * The weekly credit window from one `/billing?format=credits` body.
33
+ * @returns `{ usedPercent?, periodStart?, periodEnd?, periodType?, onDemandCap?, onDemandUsed?,
34
+ * prepaidBalance?, unified? }` with unknown fields left out.
35
+ */
36
+ export function parseGrokCredits(body) {
37
+ const config = body?.config ?? {};
38
+ const period = config.currentPeriod ?? {};
39
+ const used = percent(config.creditUsagePercent);
40
+ const onDemandCap = finite(config.onDemandCap?.val);
41
+ const onDemandUsed = finite(config.onDemandUsed?.val);
42
+ const prepaid = finite(config.prepaidBalance?.val);
43
+ const periodEnd = stamp(period.end) ?? stamp(config.billingPeriodEnd);
44
+ const periodStart = stamp(period.start) ?? stamp(config.billingPeriodStart);
45
+ return {
46
+ ...used === undefined ? {} : { usedPercent: used },
47
+ ...periodStart === undefined ? {} : { periodStart },
48
+ ...periodEnd === undefined ? {} : { periodEnd },
49
+ ...stamp(period.type) === undefined ? {} : { periodType: stamp(period.type) },
50
+ ...onDemandCap === undefined ? {} : { onDemandCap },
51
+ ...onDemandUsed === undefined ? {} : { onDemandUsed },
52
+ ...prepaid === undefined ? {} : { prepaidBalance: prepaid },
53
+ ...config.isUnifiedBillingUser === true ? { unified: true } : {},
54
+ };
55
+ }
56
+
57
+ /** The plan facts from one `/settings` body: the tier label and the access gate. */
58
+ export function parseGrokSettings(body) {
59
+ const tier = stamp(body?.subscription_tier_display);
60
+ const gate = stamp(body?.gate_message);
61
+ const gateUrl = stamp(body?.gate_url);
62
+ return {
63
+ ...tier === undefined ? {} : { tier },
64
+ ...stamp(body?.default_model) === undefined ? {} : { defaultModel: stamp(body.default_model) },
65
+ ...body?.allow_access === false ? { blocked: true } : {},
66
+ ...gate === undefined ? {} : { gateMessage: gate },
67
+ ...gateUrl === undefined ? {} : { gateUrl },
68
+ };
69
+ }
70
+
71
+ /** Both reads at once; either half may fail without losing the other. */
72
+ export async function fetchGrokSubscription({ token, userId, version = "1.0.34", fetch: fetchImpl = globalThis.fetch, now = Date.now() } = {}) {
73
+ if (typeof fetchImpl !== "function") return undefined;
74
+ const headers = { authorization: "Bearer " + token, accept: "application/json", "x-xai-token-auth": "xai-grok-cli", "x-authenticateresponse": "authenticate-response", "x-grok-client-version": version, ...userId === undefined ? {} : { "x-userid": userId } };
75
+ const read = async url => {
76
+ try {
77
+ const response = await fetchImpl(url, { headers });
78
+ return response.ok ? await response.json() : undefined;
79
+ } catch {
80
+ return undefined;
81
+ }
82
+ };
83
+ const [credits, settings] = await Promise.all([read(GROK_BILLING_URL), read(GROK_SETTINGS_URL)]);
84
+ if (credits === undefined && settings === undefined) return undefined;
85
+ return { ...parseGrokSettings(settings), ...parseGrokCredits(credits), fetchedAt: now };
86
+ }
87
+
88
+ /** The state the status line renders: cached for one refresh interval, one request in flight. */
89
+ export async function currentGrokSubscription({ home, ...options } = {}) {
90
+ if (state !== undefined && Date.now() - fetchedAt < GROK_SUBSCRIPTION_TTL_MS) return state;
91
+ if (pending) return pending;
92
+ pending = (async () => {
93
+ const next = await fetchGrokSubscription(options);
94
+ if (next !== undefined) {
95
+ state = next;
96
+ fetchedAt = next.fetchedAt ?? Date.now();
97
+ if (home !== undefined) writeGrokSubscription(home, next);
98
+ }
99
+ return state;
100
+ })().finally(() => { pending = undefined; });
101
+ return pending;
102
+ }
103
+
104
+ /** The last written subscription state, or undefined before the first successful read. */
105
+ export function readGrokSubscription(home) {
106
+ try {
107
+ const cached = JSON.parse(readFileSync(join(home, FILE), "utf8"));
108
+ return cached?.version === VERSION && typeof cached === "object" ? cached : undefined;
109
+ } catch {
110
+ return undefined;
111
+ }
112
+ }
113
+
114
+ /** Atomic write of one state snapshot; a failure leaves the previous file alone. */
115
+ export function writeGrokSubscription(home, snapshot) {
116
+ try {
117
+ mkdirSync(home, { recursive: true });
118
+ const path = join(home, FILE);
119
+ writeFileSync(path + ".tmp", JSON.stringify({ version: VERSION, ...snapshot }));
120
+ renameSync(path + ".tmp", path);
121
+ } catch { /* the status line simply keeps its previous state */ }
122
+ }
123
+
124
+ /** Replace the in-memory state; for tests. */
125
+ export function setGrokSubscription(next, at = Date.now()) {
126
+ state = next;
127
+ fetchedAt = at;
128
+ pending = undefined;
129
+ disk = undefined;
130
+ }
131
+
132
+ /**
133
+ * The cached state without waiting for a fetch; the view uses this during a render. The live
134
+ * process wins, then the state file the panel already reads, so a footer drawn before the
135
+ * first refresh — or one drawn while the network is down — still shows the last window
136
+ * instead of falling back to a bare tier name. One file read per refresh window keeps the
137
+ * render path off the disk.
138
+ */
139
+ export function grokSubscriptionNow(home = process.env.DSH_HOME) {
140
+ if (state !== undefined) return state;
141
+ if (home === undefined) return undefined;
142
+ if (disk !== undefined && disk.home === home && Date.now() - disk.at < GROK_SUBSCRIPTION_TTL_MS) return disk.value;
143
+ const value = readGrokSubscription(home);
144
+ disk = { home, at: Date.now(), value };
145
+ return value;
146
+ }
@@ -0,0 +1,122 @@
1
+ import z from "@deepseek-ai/schemastery";
2
+ import { RetryPolicySchema, resolveRetryPolicy } from "@deepseek-ai/dsh-llm";
3
+ import { credentialRef } from "@deepseek-ai/dsh-credentials";
4
+ import { deepEqualJson } from "@deepseek-ai/dsh-util-values";
5
+ import { plainConfig } from "../cordis-config/plain.mjs";
6
+ import { launchEnvironmentOf } from "@deepseek-ai/dsh-launch-environment";
7
+ import { GrokAdapter, PROVIDER } from "./adapter.mjs";
8
+ import { ensureGrokModels } from "./models.mjs";
9
+ import { GROK_SUBSCRIPTION_TTL_MS, currentGrokSubscription } from "./billing.mjs";
10
+ import { GROK_TOKEN_REF, grokAuthState } from "./auth.mjs";
11
+
12
+ // dscode: the `grok` route — the SuperGrok / X Premium+ subscription the official grok CLI
13
+ // already signed in for, driven through xAI chat completions. The token is read (never
14
+ // written) from the CLI credential file, the catalog and the weekly credit window come from
15
+ // the same CLI proxy the official client uses, and the status line reads the cached window
16
+ // instead of a dollar balance: a subscription has credits, not a bill.
17
+ export const name = "dscode-grok";
18
+ export const inject = ["llm"];
19
+ const NS = "llm-grok";
20
+ const DEFAULT_BASE_URL = "https://api.x.ai/v1";
21
+ /** The client version the CLI proxy is asked with; xAI refuses requests without one. */
22
+ const DEFAULT_CLIENT_VERSION = "1.0.34";
23
+
24
+ // DSH 0.1.7 replaced settings sections with volatile configuration: each `.volatile()`
25
+ // field arrives as a reference the Settings form and a profile edit both write, so the
26
+ // reads below always see the current value.
27
+ export const Config = z.object({
28
+ apiKeyEnv: z.string().role("credential-ref").default(GROK_TOKEN_REF).volatile(),
29
+ baseURL: z.string().default(DEFAULT_BASE_URL).volatile(),
30
+ clientVersion: z.string().default(DEFAULT_CLIENT_VERSION).volatile(),
31
+ streamIdleTimeoutMs: z.number().min(1).default(300000).volatile(),
32
+ retryPolicy: RetryPolicySchema.volatile(),
33
+ });
34
+
35
+
36
+ /** Validated connection facts from one config snapshot. */
37
+ export function resolveOptions(config = {}) {
38
+ const streamIdleTimeoutMs = config.streamIdleTimeoutMs ?? 300000;
39
+ if (!Number.isFinite(streamIdleTimeoutMs) || streamIdleTimeoutMs <= 0) throw new Error(name + ": streamIdleTimeoutMs must be a positive number");
40
+ const baseURL = (config.baseURL || DEFAULT_BASE_URL).replace(/\/+$/, "");
41
+ if (!URL.canParse(baseURL)) throw new Error(name + ": baseURL must be a URL");
42
+ return {
43
+ apiKeyEnv: credentialRef(config.apiKeyEnv || GROK_TOKEN_REF),
44
+ baseURL,
45
+ clientVersion: config.clientVersion || DEFAULT_CLIENT_VERSION,
46
+ streamIdleTimeoutMs,
47
+ retryPolicy: resolveRetryPolicy(config.retryPolicy, name + ": retryPolicy"),
48
+ };
49
+ }
50
+
51
+ /** The message a missing or expired CLI login deserves: the fix is a command, not a paste. */
52
+ export function loginHint(state) {
53
+ if (state.kind === 'missing') return name + ': no local grok login found; run "grok login" (DSCODE reads ~/.grok/auth.json read-only)';
54
+ if (state.kind === 'expired') return name + ': the local grok login expired; run "grok login" again (DSCODE never rotates that token)';
55
+ return name + ': the local grok login file was not readable; run "grok login" again';
56
+ }
57
+
58
+ export function apply(ctx, config = {}) {
59
+ // The TUI renders this route's own page, so Settings must not generate a form for it.
60
+ ctx.inject(["settings"], settingsCtx => {
61
+ settingsCtx.effect(() => settingsCtx.settings.configure({ auto: false }, ctx.fiber));
62
+ });
63
+ let lastGood;
64
+ const options = () => {
65
+ try {
66
+ lastGood = resolveOptions(plainConfig(config));
67
+ return lastGood;
68
+ } catch (error) {
69
+ if (lastGood === undefined) throw error;
70
+ ctx.logger.error(name + ": keeping the last good configuration after an invalid edit");
71
+ return lastGood;
72
+ }
73
+ };
74
+ options();
75
+ const home = process.env.DSH_HOME;
76
+ /** The credential the route calls with, or undefined: the catalog must load without a login. */
77
+ const resolveTokenSafe = async () => {
78
+ const ref = options().apiKeyEnv;
79
+ const credentials = ctx.get("credentials");
80
+ try {
81
+ const stored = credentials === undefined ? launchEnvironmentOf(ctx).get(ref)?.value : (await credentials.resolve(ref))?.value;
82
+ if (stored !== undefined && stored.length > 0) return stored;
83
+ } catch { /* fall through to the local login state for a better message */ }
84
+ const state = grokAuthState();
85
+ return state.kind === "ready" ? state.credential.token : undefined;
86
+ };
87
+ const resolveToken = async () => {
88
+ const token = await resolveTokenSafe();
89
+ if (token !== undefined) return token;
90
+ throw new Error(loginHint(grokAuthState()));
91
+ };
92
+ const ensureModels = async () => {
93
+ const token = await resolveTokenSafe();
94
+ if (token === undefined) return;
95
+ await ensureGrokModels({ home, token, version: options().clientVersion });
96
+ };
97
+ const adapter = new GrokAdapter({ options, ensureModels, resolveToken });
98
+ ctx.llm.registerConfigurableProviders([{ provider: PROVIDER, displayName: "Grok", settingsNs: ctx.fiber.entry?.options.id ?? NS, settingsPath: [] }]);
99
+ const registration = ctx.llm.registerAdapter([PROVIDER], adapter);
100
+ // The retry policy is captured at registration, and a reference carries no change
101
+ // callback: re-register the route when an edit lands on a different policy.
102
+ let registeredPolicy = options().retryPolicy;
103
+ ctx.on("loader/volatile-update", () => {
104
+ let policy;
105
+ try { policy = options().retryPolicy; } catch (error) { ctx.logger.warn(error); return; }
106
+ if (deepEqualJson(policy, registeredPolicy)) return;
107
+ registration.replace([PROVIDER]);
108
+ registeredPolicy = policy;
109
+ });
110
+ // Warm the catalog and the weekly window for a user who already ran `grok login`, then keep
111
+ // the window fresh at the interval the official CLI itself watches (subscription_watch_interval_secs).
112
+ const refresh = async () => {
113
+ const state = grokAuthState();
114
+ if (state.kind !== "ready") return;
115
+ await ensureGrokModels({ home, token: state.credential.token, version: options().clientVersion });
116
+ await currentGrokSubscription({ home, token: state.credential.token, userId: state.credential.userId, version: options().clientVersion });
117
+ };
118
+ void refresh().catch(() => {});
119
+ const timer = setInterval(() => { void refresh().catch(() => {}); }, GROK_SUBSCRIPTION_TTL_MS);
120
+ timer.unref?.();
121
+ ctx.effect(() => () => clearInterval(timer));
122
+ }
@@ -0,0 +1,129 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ // dscode: the Grok model catalog. The subscription rail serves its models from the same
5
+ // CLI proxy the official `grok` client uses, and that listing carries what a harness needs:
6
+ // the context window, the reasoning detents (xhigh/high/medium/low, which are DSCODE effort
7
+ // ids already), the backend-search flag and the compaction threshold. One table, kept for a
8
+ // day in DSH_HOME, backs /model, compaction and the status line.
9
+
10
+ export const GROK_MODELS_URL = "https://cli-chat-proxy.grok.com/v1/models";
11
+ /** How long a first model lookup waits for the listing before answering without it. */
12
+ export const GROK_MODELS_TIMEOUT_MS = 10_000;
13
+ /** How long a failed listing (or an unusable cache file) waits before the next attempt. */
14
+ export const GROK_MODELS_RETRY_MS = 10 * 60 * 1000;
15
+ const MAX_AGE_MS = 24 * 60 * 60 * 1000;
16
+ const FILE = "grok-models.json";
17
+ const VERSION = 1;
18
+ /** Reasoning detents DSCODE names; the wire spells them the same way through this route. */
19
+ export const GROK_EFFORTS = Object.freeze(["low", "medium", "high", "xhigh"]);
20
+ /** Media models the chat route must not offer to an agent. */
21
+ const NON_CHAT = /(?:imagine|video|image|audio|vision-gen)/i;
22
+ let table = { fetchedAt: 0, models: {} };
23
+ let cacheReadAt = 0;
24
+ let attemptedAt = 0, pending;
25
+
26
+ const positive = value => Number.isSafeInteger(value) && value > 0 ? value : undefined;
27
+
28
+ /**
29
+ * Models from one `/models` body of the Grok CLI proxy, or of the public api.x.ai listing.
30
+ * @returns `{ [id]: { name, description?, contextWindow?, maxOutput?, efforts?, defaultEffort?,
31
+ * backendSearch?, compactThresholdPercent?, compactionAtTokens? } }`
32
+ */
33
+ export function parseGrokModels(body) {
34
+ const models = {};
35
+ for (const model of Array.isArray(body?.data) ? body.data : []) {
36
+ const id = typeof model?.id === "string" ? model.id : typeof model?.model === "string" ? model.model : undefined;
37
+ if (id === undefined || id.length === 0 || NON_CHAT.test(id)) continue;
38
+ const efforts = (Array.isArray(model.reasoning_efforts) ? model.reasoning_efforts : [])
39
+ .map(entry => typeof entry === "string" ? entry : entry?.id)
40
+ .filter(level => GROK_EFFORTS.includes(level));
41
+ const named = efforts.length > 0 ? GROK_EFFORTS.filter(level => efforts.includes(level)) : undefined;
42
+ const defaultEffort = typeof model.reasoning_effort === "string" && GROK_EFFORTS.includes(model.reasoning_effort) ? model.reasoning_effort : undefined;
43
+ const contextWindow = positive(model.context_window) ?? positive(model.context_length);
44
+ models[id] = {
45
+ name: typeof model.name === "string" && model.name.length > 0 ? model.name : id,
46
+ ...typeof model.description === "string" && model.description.length > 0 ? { description: model.description } : {},
47
+ ...contextWindow === undefined ? {} : { contextWindow },
48
+ ...positive(model.max_completion_tokens) === undefined ? {} : { maxOutput: positive(model.max_completion_tokens) },
49
+ ...named === undefined ? {} : { efforts: named }, ...defaultEffort === undefined ? {} : { defaultEffort },
50
+ ...model.supports_backend_search === true ? { backendSearch: true } : {},
51
+ ...positive(model.auto_compact_threshold_percent) === undefined ? {} : { compactThresholdPercent: positive(model.auto_compact_threshold_percent) },
52
+ ...model.compaction_at_tokens === true ? { compactionAtTokens: true } : {},
53
+ };
54
+ }
55
+ return models;
56
+ }
57
+
58
+ /** One model entry, or undefined when the table does not list it. */
59
+ export function grokModel(id) {
60
+ return Object.hasOwn(table.models, id) ? table.models[id] : undefined;
61
+ }
62
+
63
+ /** Every listed model as `[id, entry]` pairs, in listing order. */
64
+ export function listGrokModels() {
65
+ return Object.entries(table.models);
66
+ }
67
+
68
+ /** Replace the table (and forget the last attempt); for tests and cache loads. */
69
+ export function setGrokModels(models, fetchedAt = Date.now()) {
70
+ table = { fetchedAt, models };
71
+ cacheReadAt = 0;
72
+ attemptedAt = 0;
73
+ }
74
+
75
+ /** The headers the official CLI sends; the proxy answers a request without them with its generic API rail. */
76
+ export function grokCliHeaders(token, version) {
77
+ return { authorization: "Bearer " + token, accept: "application/json", "x-xai-token-auth": "xai-grok-cli", "x-grok-client-version": version };
78
+ }
79
+
80
+ /**
81
+ * Load the cached table, then refetch it once it is a day old. A failure keeps the last
82
+ * table and waits ten minutes before trying again; never throws.
83
+ */
84
+ export async function refreshGrokModels({ home, token, version = "1.0.34", fetch: fetchImpl = globalThis.fetch, now = Date.now() } = {}) {
85
+ const path = home ? join(home, FILE) : undefined;
86
+ if (table.fetchedAt === 0 && path && now - cacheReadAt >= GROK_MODELS_RETRY_MS) {
87
+ cacheReadAt = now;
88
+ try {
89
+ const cached = JSON.parse(readFileSync(path, "utf8"));
90
+ if (cached?.version === VERSION && Number.isFinite(cached.fetchedAt) && cached.models && typeof cached.models === "object") table = { fetchedAt: cached.fetchedAt, models: cached.models };
91
+ } catch { /* no usable cache */ }
92
+ }
93
+ if (now - table.fetchedAt < MAX_AGE_MS || now - attemptedAt < GROK_MODELS_RETRY_MS || token === undefined || typeof fetchImpl !== "function") return table;
94
+ if (pending) return pending;
95
+ attemptedAt = now;
96
+ pending = (async () => {
97
+ try {
98
+ const response = await fetchImpl(GROK_MODELS_URL, { headers: grokCliHeaders(token, version) });
99
+ if (!response.ok) return table;
100
+ const models = parseGrokModels(await response.json());
101
+ if (Object.keys(models).length === 0) return table;
102
+ table = { fetchedAt: now, models };
103
+ if (path) {
104
+ mkdirSync(home, { recursive: true });
105
+ writeFileSync(path + ".tmp", JSON.stringify({ version: VERSION, ...table }));
106
+ renameSync(path + ".tmp", path);
107
+ }
108
+ return table;
109
+ } catch {
110
+ return table;
111
+ } finally {
112
+ pending = undefined;
113
+ }
114
+ })();
115
+ return pending;
116
+ }
117
+
118
+ /**
119
+ * The table before a model lookup: an empty one waits up to `timeoutMs` for the listing,
120
+ * a stale one refreshes in the background.
121
+ */
122
+ export async function ensureGrokModels({ timeoutMs = GROK_MODELS_TIMEOUT_MS, ...options } = {}) {
123
+ const refresh = refreshGrokModels(options);
124
+ if (Object.keys(table.models).length > 0) return table;
125
+ let timer;
126
+ await Promise.race([refresh, new Promise(resolve => { timer = setTimeout(resolve, timeoutMs); timer.unref?.(); })]);
127
+ clearTimeout(timer);
128
+ return table;
129
+ }
@@ -0,0 +1,28 @@
1
+ import { grokAuthState, minutesLeft } from "./auth.mjs";
2
+ import { grokSubscriptionNow, readGrokSubscription } from "./billing.mjs";
3
+
4
+ // dscode: one snapshot for the two surfaces that show the Grok rail: the /login grok panel and
5
+ // the provider list. The live process value wins; a state file written by another process (a
6
+ // second DSCODE on the same Mac) is the fallback, so a panel opened before the first refresh
7
+ // still shows the last known window.
8
+
9
+ /**
10
+ * @returns `{ status: { kind, expiresIn? }, subscription? }`; `kind` is the local login state
11
+ * (`ready`, `expired`, `missing`, `malformed`) and `expiresIn` is minutes on a ready login.
12
+ */
13
+ export function grokStatusSnapshot({ home = process.env.DSH_HOME, now = Date.now() } = {}) {
14
+ const auth = grokAuthState({ now });
15
+ const stored = grokSubscriptionNow() ?? (home === undefined ? undefined : readGrokSubscription(home));
16
+ return {
17
+ status: { kind: auth.kind, ...auth.kind === "ready" ? { expiresIn: minutesLeft(auth.credential, now) } : {} },
18
+ ...stored === undefined ? {} : { subscription: stored },
19
+ };
20
+ }
21
+
22
+ /** One line for the provider list: the login state, not a key name. */
23
+ export function grokStatusText(snapshot = grokStatusSnapshot()) {
24
+ if (snapshot.status.kind === "ready") return "grok login detected";
25
+ if (snapshot.status.kind === "expired") return "grok login expired · run grok login";
26
+ if (snapshot.status.kind === "malformed") return "grok login file unreadable · run grok login";
27
+ return "no grok login · run grok login";
28
+ }