@xixka/dsh-hub 0.0.0-stage → 0.2.1-rc.2

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 (1024) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +935 -2
  3. package/cordis.patch.yml +8 -0
  4. package/lib/accio-adapter.d.ts +443 -0
  5. package/lib/accio-adapter.d.ts.map +1 -0
  6. package/lib/accio-adapter.js +1877 -0
  7. package/lib/accio-adapter.js.map +1 -0
  8. package/lib/accio-auth.d.ts +301 -0
  9. package/lib/accio-auth.d.ts.map +1 -0
  10. package/lib/accio-auth.js +887 -0
  11. package/lib/accio-auth.js.map +1 -0
  12. package/lib/accio-credits.d.ts +148 -0
  13. package/lib/accio-credits.d.ts.map +1 -0
  14. package/lib/accio-credits.js +509 -0
  15. package/lib/accio-credits.js.map +1 -0
  16. package/lib/accio-messages.d.ts +163 -0
  17. package/lib/accio-messages.d.ts.map +1 -0
  18. package/lib/accio-messages.js +618 -0
  19. package/lib/accio-messages.js.map +1 -0
  20. package/lib/accio-oauth.d.ts +78 -0
  21. package/lib/accio-oauth.d.ts.map +1 -0
  22. package/lib/accio-oauth.js +182 -0
  23. package/lib/accio-oauth.js.map +1 -0
  24. package/lib/accio-product.d.ts +95 -0
  25. package/lib/accio-product.d.ts.map +1 -0
  26. package/lib/accio-product.js +74 -0
  27. package/lib/accio-product.js.map +1 -0
  28. package/lib/accio.d.ts +92 -0
  29. package/lib/accio.d.ts.map +1 -0
  30. package/lib/accio.js +163 -0
  31. package/lib/accio.js.map +1 -0
  32. package/lib/account-pool.d.ts +1540 -0
  33. package/lib/account-pool.d.ts.map +1 -0
  34. package/lib/account-pool.js +3075 -0
  35. package/lib/account-pool.js.map +1 -0
  36. package/lib/account-probe.d.ts +160 -0
  37. package/lib/account-probe.d.ts.map +1 -0
  38. package/lib/account-probe.js +470 -0
  39. package/lib/account-probe.js.map +1 -0
  40. package/lib/aggregate-adapter.d.ts +1408 -0
  41. package/lib/aggregate-adapter.d.ts.map +1 -0
  42. package/lib/aggregate-adapter.js +3134 -0
  43. package/lib/aggregate-adapter.js.map +1 -0
  44. package/lib/aggregate-catalog.d.ts +53 -0
  45. package/lib/aggregate-catalog.d.ts.map +1 -0
  46. package/lib/aggregate-catalog.js +82 -0
  47. package/lib/aggregate-catalog.js.map +1 -0
  48. package/lib/aggregate-core.d.ts +157 -0
  49. package/lib/aggregate-core.d.ts.map +1 -0
  50. package/lib/aggregate-core.js +145 -0
  51. package/lib/aggregate-core.js.map +1 -0
  52. package/lib/aggregate-expiry.d.ts +843 -0
  53. package/lib/aggregate-expiry.d.ts.map +1 -0
  54. package/lib/aggregate-expiry.js +1933 -0
  55. package/lib/aggregate-expiry.js.map +1 -0
  56. package/lib/analyze-image.d.ts +169 -0
  57. package/lib/analyze-image.d.ts.map +1 -0
  58. package/lib/analyze-image.js +271 -0
  59. package/lib/analyze-image.js.map +1 -0
  60. package/lib/astudio-adapter.d.ts +231 -0
  61. package/lib/astudio-adapter.d.ts.map +1 -0
  62. package/lib/astudio-adapter.js +523 -0
  63. package/lib/astudio-adapter.js.map +1 -0
  64. package/lib/astudio-auth.d.ts +328 -0
  65. package/lib/astudio-auth.d.ts.map +1 -0
  66. package/lib/astudio-auth.js +778 -0
  67. package/lib/astudio-auth.js.map +1 -0
  68. package/lib/astudio-credits.d.ts +155 -0
  69. package/lib/astudio-credits.d.ts.map +1 -0
  70. package/lib/astudio-credits.js +817 -0
  71. package/lib/astudio-credits.js.map +1 -0
  72. package/lib/astudio-oauth.d.ts +344 -0
  73. package/lib/astudio-oauth.d.ts.map +1 -0
  74. package/lib/astudio-oauth.js +1498 -0
  75. package/lib/astudio-oauth.js.map +1 -0
  76. package/lib/astudio-product.d.ts +170 -0
  77. package/lib/astudio-product.d.ts.map +1 -0
  78. package/lib/astudio-product.js +178 -0
  79. package/lib/astudio-product.js.map +1 -0
  80. package/lib/astudio.d.ts +546 -0
  81. package/lib/astudio.d.ts.map +1 -0
  82. package/lib/astudio.js +996 -0
  83. package/lib/astudio.js.map +1 -0
  84. package/lib/auto-adapter.d.ts +550 -0
  85. package/lib/auto-adapter.d.ts.map +1 -0
  86. package/lib/auto-adapter.js +1062 -0
  87. package/lib/auto-adapter.js.map +1 -0
  88. package/lib/auto-badge.d.ts +92 -0
  89. package/lib/auto-badge.d.ts.map +1 -0
  90. package/lib/auto-badge.js +136 -0
  91. package/lib/auto-badge.js.map +1 -0
  92. package/lib/auto-checkin.d.ts +309 -0
  93. package/lib/auto-checkin.d.ts.map +1 -0
  94. package/lib/auto-checkin.js +535 -0
  95. package/lib/auto-checkin.js.map +1 -0
  96. package/lib/autoclaw-adapter.d.ts +224 -0
  97. package/lib/autoclaw-adapter.d.ts.map +1 -0
  98. package/lib/autoclaw-adapter.js +590 -0
  99. package/lib/autoclaw-adapter.js.map +1 -0
  100. package/lib/autoclaw-auth.d.ts +282 -0
  101. package/lib/autoclaw-auth.d.ts.map +1 -0
  102. package/lib/autoclaw-auth.js +700 -0
  103. package/lib/autoclaw-auth.js.map +1 -0
  104. package/lib/autoclaw-credits.d.ts +257 -0
  105. package/lib/autoclaw-credits.d.ts.map +1 -0
  106. package/lib/autoclaw-credits.js +831 -0
  107. package/lib/autoclaw-credits.js.map +1 -0
  108. package/lib/autoclaw-oauth.d.ts +176 -0
  109. package/lib/autoclaw-oauth.d.ts.map +1 -0
  110. package/lib/autoclaw-oauth.js +913 -0
  111. package/lib/autoclaw-oauth.js.map +1 -0
  112. package/lib/autoclaw-product.d.ts +296 -0
  113. package/lib/autoclaw-product.d.ts.map +1 -0
  114. package/lib/autoclaw-product.js +316 -0
  115. package/lib/autoclaw-product.js.map +1 -0
  116. package/lib/autoclaw.d.ts +387 -0
  117. package/lib/autoclaw.d.ts.map +1 -0
  118. package/lib/autoclaw.js +788 -0
  119. package/lib/autoclaw.js.map +1 -0
  120. package/lib/backup.d.ts +144 -0
  121. package/lib/backup.d.ts.map +1 -0
  122. package/lib/backup.js +541 -0
  123. package/lib/backup.js.map +1 -0
  124. package/lib/badge-preferences.d.ts +69 -0
  125. package/lib/badge-preferences.d.ts.map +1 -0
  126. package/lib/badge-preferences.js +126 -0
  127. package/lib/badge-preferences.js.map +1 -0
  128. package/lib/badge-subscription.d.ts +98 -0
  129. package/lib/badge-subscription.d.ts.map +1 -0
  130. package/lib/badge-subscription.js +155 -0
  131. package/lib/badge-subscription.js.map +1 -0
  132. package/lib/balance-cache.d.ts +409 -0
  133. package/lib/balance-cache.d.ts.map +1 -0
  134. package/lib/balance-cache.js +638 -0
  135. package/lib/balance-cache.js.map +1 -0
  136. package/lib/buddy-adapter.d.ts +579 -0
  137. package/lib/buddy-adapter.d.ts.map +1 -0
  138. package/lib/buddy-adapter.js +4469 -0
  139. package/lib/buddy-adapter.js.map +1 -0
  140. package/lib/buddy-auth.d.ts +192 -0
  141. package/lib/buddy-auth.d.ts.map +1 -0
  142. package/lib/buddy-auth.js +448 -0
  143. package/lib/buddy-auth.js.map +1 -0
  144. package/lib/buddy-balance-rank.d.ts +184 -0
  145. package/lib/buddy-balance-rank.d.ts.map +1 -0
  146. package/lib/buddy-balance-rank.js +350 -0
  147. package/lib/buddy-balance-rank.js.map +1 -0
  148. package/lib/buddy-balance-selector.d.ts +393 -0
  149. package/lib/buddy-balance-selector.d.ts.map +1 -0
  150. package/lib/buddy-balance-selector.js +362 -0
  151. package/lib/buddy-balance-selector.js.map +1 -0
  152. package/lib/buddy-compensation.d.ts +175 -0
  153. package/lib/buddy-compensation.d.ts.map +1 -0
  154. package/lib/buddy-compensation.js +331 -0
  155. package/lib/buddy-compensation.js.map +1 -0
  156. package/lib/buddy-growth.d.ts +360 -0
  157. package/lib/buddy-growth.d.ts.map +1 -0
  158. package/lib/buddy-growth.js +2439 -0
  159. package/lib/buddy-growth.js.map +1 -0
  160. package/lib/buddy-oauth.d.ts +155 -0
  161. package/lib/buddy-oauth.d.ts.map +1 -0
  162. package/lib/buddy-oauth.js +507 -0
  163. package/lib/buddy-oauth.js.map +1 -0
  164. package/lib/buddy.d.ts +334 -0
  165. package/lib/buddy.d.ts.map +1 -0
  166. package/lib/buddy.js +813 -0
  167. package/lib/buddy.js.map +1 -0
  168. package/lib/canonical-models.d.ts +154 -0
  169. package/lib/canonical-models.d.ts.map +1 -0
  170. package/lib/canonical-models.js +348 -0
  171. package/lib/canonical-models.js.map +1 -0
  172. package/lib/captcha-backoff.d.ts +153 -0
  173. package/lib/captcha-backoff.d.ts.map +1 -0
  174. package/lib/captcha-backoff.js +197 -0
  175. package/lib/captcha-backoff.js.map +1 -0
  176. package/lib/captcha-carrier-server.d.ts +54 -0
  177. package/lib/captcha-carrier-server.d.ts.map +1 -0
  178. package/lib/captcha-carrier-server.js +220 -0
  179. package/lib/captcha-carrier-server.js.map +1 -0
  180. package/lib/captcha-carrier.d.ts +134 -0
  181. package/lib/captcha-carrier.d.ts.map +1 -0
  182. package/lib/captcha-carrier.js +162 -0
  183. package/lib/captcha-carrier.js.map +1 -0
  184. package/lib/captcha-pool.d.ts +184 -0
  185. package/lib/captcha-pool.d.ts.map +1 -0
  186. package/lib/captcha-pool.js +238 -0
  187. package/lib/captcha-pool.js.map +1 -0
  188. package/lib/captcha-requirement.d.ts +76 -0
  189. package/lib/captcha-requirement.d.ts.map +1 -0
  190. package/lib/captcha-requirement.js +118 -0
  191. package/lib/captcha-requirement.js.map +1 -0
  192. package/lib/captcha-supply.d.ts +83 -0
  193. package/lib/captcha-supply.d.ts.map +1 -0
  194. package/lib/captcha-supply.js +190 -0
  195. package/lib/captcha-supply.js.map +1 -0
  196. package/lib/catalog-broadcast.d.ts +41 -0
  197. package/lib/catalog-broadcast.d.ts.map +1 -0
  198. package/lib/catalog-broadcast.js +66 -0
  199. package/lib/catalog-broadcast.js.map +1 -0
  200. package/lib/catalog-prewarm.d.ts +91 -0
  201. package/lib/catalog-prewarm.d.ts.map +1 -0
  202. package/lib/catalog-prewarm.js +149 -0
  203. package/lib/catalog-prewarm.js.map +1 -0
  204. package/lib/chromium-session.d.ts +520 -0
  205. package/lib/chromium-session.d.ts.map +1 -0
  206. package/lib/chromium-session.js +1511 -0
  207. package/lib/chromium-session.js.map +1 -0
  208. package/lib/client/jet-hub.js +14617 -0
  209. package/lib/cline-adapter.d.ts +538 -0
  210. package/lib/cline-adapter.d.ts.map +1 -0
  211. package/lib/cline-adapter.js +1129 -0
  212. package/lib/cline-adapter.js.map +1 -0
  213. package/lib/cline-auth.d.ts +217 -0
  214. package/lib/cline-auth.d.ts.map +1 -0
  215. package/lib/cline-auth.js +449 -0
  216. package/lib/cline-auth.js.map +1 -0
  217. package/lib/cline-credits.d.ts +124 -0
  218. package/lib/cline-credits.d.ts.map +1 -0
  219. package/lib/cline-credits.js +199 -0
  220. package/lib/cline-credits.js.map +1 -0
  221. package/lib/cline-models-dev.d.ts +167 -0
  222. package/lib/cline-models-dev.d.ts.map +1 -0
  223. package/lib/cline-models-dev.js +291 -0
  224. package/lib/cline-models-dev.js.map +1 -0
  225. package/lib/cline-models.d.ts +230 -0
  226. package/lib/cline-models.d.ts.map +1 -0
  227. package/lib/cline-models.js +376 -0
  228. package/lib/cline-models.js.map +1 -0
  229. package/lib/cline-oauth.d.ts +179 -0
  230. package/lib/cline-oauth.d.ts.map +1 -0
  231. package/lib/cline-oauth.js +351 -0
  232. package/lib/cline-oauth.js.map +1 -0
  233. package/lib/cline-product.d.ts +210 -0
  234. package/lib/cline-product.d.ts.map +1 -0
  235. package/lib/cline-product.js +246 -0
  236. package/lib/cline-product.js.map +1 -0
  237. package/lib/cline-quota.d.ts +95 -0
  238. package/lib/cline-quota.d.ts.map +1 -0
  239. package/lib/cline-quota.js +209 -0
  240. package/lib/cline-quota.js.map +1 -0
  241. package/lib/cline-rate-limit.d.ts +162 -0
  242. package/lib/cline-rate-limit.d.ts.map +1 -0
  243. package/lib/cline-rate-limit.js +258 -0
  244. package/lib/cline-rate-limit.js.map +1 -0
  245. package/lib/cline-request-log.d.ts +130 -0
  246. package/lib/cline-request-log.d.ts.map +1 -0
  247. package/lib/cline-request-log.js +115 -0
  248. package/lib/cline-request-log.js.map +1 -0
  249. package/lib/cline-routing.d.ts +57 -0
  250. package/lib/cline-routing.d.ts.map +1 -0
  251. package/lib/cline-routing.js +101 -0
  252. package/lib/cline-routing.js.map +1 -0
  253. package/lib/cline.d.ts +170 -0
  254. package/lib/cline.d.ts.map +1 -0
  255. package/lib/cline.js +227 -0
  256. package/lib/cline.js.map +1 -0
  257. package/lib/codearts-credits.d.ts +213 -0
  258. package/lib/codearts-credits.d.ts.map +1 -0
  259. package/lib/codearts-credits.js +656 -0
  260. package/lib/codearts-credits.js.map +1 -0
  261. package/lib/codearts-vision.d.ts +194 -0
  262. package/lib/codearts-vision.d.ts.map +1 -0
  263. package/lib/codearts-vision.js +272 -0
  264. package/lib/codearts-vision.js.map +1 -0
  265. package/lib/codely-adapter.d.ts +262 -0
  266. package/lib/codely-adapter.d.ts.map +1 -0
  267. package/lib/codely-adapter.js +1531 -0
  268. package/lib/codely-adapter.js.map +1 -0
  269. package/lib/codely-auth-service.d.ts +102 -0
  270. package/lib/codely-auth-service.d.ts.map +1 -0
  271. package/lib/codely-auth-service.js +175 -0
  272. package/lib/codely-auth-service.js.map +1 -0
  273. package/lib/codely-auth.d.ts +301 -0
  274. package/lib/codely-auth.d.ts.map +1 -0
  275. package/lib/codely-auth.js +524 -0
  276. package/lib/codely-auth.js.map +1 -0
  277. package/lib/codely-cli.d.ts +125 -0
  278. package/lib/codely-cli.d.ts.map +1 -0
  279. package/lib/codely-cli.js +220 -0
  280. package/lib/codely-cli.js.map +1 -0
  281. package/lib/codely-credits.d.ts +95 -0
  282. package/lib/codely-credits.d.ts.map +1 -0
  283. package/lib/codely-credits.js +359 -0
  284. package/lib/codely-credits.js.map +1 -0
  285. package/lib/codely-product.d.ts +82 -0
  286. package/lib/codely-product.d.ts.map +1 -0
  287. package/lib/codely-product.js +69 -0
  288. package/lib/codely-product.js.map +1 -0
  289. package/lib/codely-sign.d.ts +112 -0
  290. package/lib/codely-sign.d.ts.map +1 -0
  291. package/lib/codely-sign.js +134 -0
  292. package/lib/codely-sign.js.map +1 -0
  293. package/lib/credential-resolver.d.ts +324 -0
  294. package/lib/credential-resolver.d.ts.map +1 -0
  295. package/lib/credential-resolver.js +341 -0
  296. package/lib/credential-resolver.js.map +1 -0
  297. package/lib/credits.d.ts +539 -0
  298. package/lib/credits.d.ts.map +1 -0
  299. package/lib/credits.js +535 -0
  300. package/lib/credits.js.map +1 -0
  301. package/lib/dead-model-store.d.ts +177 -0
  302. package/lib/dead-model-store.d.ts.map +1 -0
  303. package/lib/dead-model-store.js +662 -0
  304. package/lib/dead-model-store.js.map +1 -0
  305. package/lib/dsml.d.ts +195 -0
  306. package/lib/dsml.d.ts.map +1 -0
  307. package/lib/dsml.js +626 -0
  308. package/lib/dsml.js.map +1 -0
  309. package/lib/expiry-sync.d.ts +190 -0
  310. package/lib/expiry-sync.d.ts.map +1 -0
  311. package/lib/expiry-sync.js +161 -0
  312. package/lib/expiry-sync.js.map +1 -0
  313. package/lib/gemini-adapter.d.ts +262 -0
  314. package/lib/gemini-adapter.d.ts.map +1 -0
  315. package/lib/gemini-adapter.js +677 -0
  316. package/lib/gemini-adapter.js.map +1 -0
  317. package/lib/gemini-auth.d.ts +188 -0
  318. package/lib/gemini-auth.d.ts.map +1 -0
  319. package/lib/gemini-auth.js +491 -0
  320. package/lib/gemini-auth.js.map +1 -0
  321. package/lib/gemini-credits.d.ts +180 -0
  322. package/lib/gemini-credits.d.ts.map +1 -0
  323. package/lib/gemini-credits.js +388 -0
  324. package/lib/gemini-credits.js.map +1 -0
  325. package/lib/gemini-messages.d.ts +228 -0
  326. package/lib/gemini-messages.d.ts.map +1 -0
  327. package/lib/gemini-messages.js +731 -0
  328. package/lib/gemini-messages.js.map +1 -0
  329. package/lib/gemini-oauth.d.ts +173 -0
  330. package/lib/gemini-oauth.d.ts.map +1 -0
  331. package/lib/gemini-oauth.js +438 -0
  332. package/lib/gemini-oauth.js.map +1 -0
  333. package/lib/gemini-project.d.ts +101 -0
  334. package/lib/gemini-project.d.ts.map +1 -0
  335. package/lib/gemini-project.js +150 -0
  336. package/lib/gemini-project.js.map +1 -0
  337. package/lib/gemini-proxy.d.ts +90 -0
  338. package/lib/gemini-proxy.d.ts.map +1 -0
  339. package/lib/gemini-proxy.js +131 -0
  340. package/lib/gemini-proxy.js.map +1 -0
  341. package/lib/gemini-rpc.d.ts +65 -0
  342. package/lib/gemini-rpc.d.ts.map +1 -0
  343. package/lib/gemini-rpc.js +119 -0
  344. package/lib/gemini-rpc.js.map +1 -0
  345. package/lib/gemini-sigstore.d.ts +149 -0
  346. package/lib/gemini-sigstore.d.ts.map +1 -0
  347. package/lib/gemini-sigstore.js +241 -0
  348. package/lib/gemini-sigstore.js.map +1 -0
  349. package/lib/gemini.d.ts +378 -0
  350. package/lib/gemini.d.ts.map +1 -0
  351. package/lib/gemini.js +608 -0
  352. package/lib/gemini.js.map +1 -0
  353. package/lib/image-budget.d.ts +204 -0
  354. package/lib/image-budget.d.ts.map +1 -0
  355. package/lib/image-budget.js +212 -0
  356. package/lib/image-budget.js.map +1 -0
  357. package/lib/index.d.ts +121 -0
  358. package/lib/index.d.ts.map +1 -0
  359. package/lib/index.js +5776 -0
  360. package/lib/index.js.map +1 -0
  361. package/lib/jet-hub-rpc.d.ts +891 -0
  362. package/lib/jet-hub-rpc.d.ts.map +1 -0
  363. package/lib/jet-hub-rpc.js +8075 -0
  364. package/lib/jet-hub-rpc.js.map +1 -0
  365. package/lib/jet-hub-store.d.ts +689 -0
  366. package/lib/jet-hub-store.d.ts.map +1 -0
  367. package/lib/jet-hub-store.js +1308 -0
  368. package/lib/jet-hub-store.js.map +1 -0
  369. package/lib/llm-adapter.d.ts +1015 -0
  370. package/lib/llm-adapter.d.ts.map +1 -0
  371. package/lib/llm-adapter.js +3042 -0
  372. package/lib/llm-adapter.js.map +1 -0
  373. package/lib/llm-register-compat.d.ts +219 -0
  374. package/lib/llm-register-compat.d.ts.map +1 -0
  375. package/lib/llm-register-compat.js +413 -0
  376. package/lib/llm-register-compat.js.map +1 -0
  377. package/lib/lobsterai-adapter.d.ts +404 -0
  378. package/lib/lobsterai-adapter.d.ts.map +1 -0
  379. package/lib/lobsterai-adapter.js +1738 -0
  380. package/lib/lobsterai-adapter.js.map +1 -0
  381. package/lib/lobsterai-auth.d.ts +282 -0
  382. package/lib/lobsterai-auth.d.ts.map +1 -0
  383. package/lib/lobsterai-auth.js +611 -0
  384. package/lib/lobsterai-auth.js.map +1 -0
  385. package/lib/lobsterai-credits.d.ts +108 -0
  386. package/lib/lobsterai-credits.d.ts.map +1 -0
  387. package/lib/lobsterai-credits.js +417 -0
  388. package/lib/lobsterai-credits.js.map +1 -0
  389. package/lib/lobsterai-errors.d.ts +162 -0
  390. package/lib/lobsterai-errors.d.ts.map +1 -0
  391. package/lib/lobsterai-errors.js +191 -0
  392. package/lib/lobsterai-errors.js.map +1 -0
  393. package/lib/lobsterai-oauth.d.ts +137 -0
  394. package/lib/lobsterai-oauth.d.ts.map +1 -0
  395. package/lib/lobsterai-oauth.js +249 -0
  396. package/lib/lobsterai-oauth.js.map +1 -0
  397. package/lib/lobsterai-product.d.ts +186 -0
  398. package/lib/lobsterai-product.d.ts.map +1 -0
  399. package/lib/lobsterai-product.js +166 -0
  400. package/lib/lobsterai-product.js.map +1 -0
  401. package/lib/lobsterai.d.ts +424 -0
  402. package/lib/lobsterai.d.ts.map +1 -0
  403. package/lib/lobsterai.js +568 -0
  404. package/lib/lobsterai.js.map +1 -0
  405. package/lib/locked-error-text.d.ts +34 -0
  406. package/lib/locked-error-text.d.ts.map +1 -0
  407. package/lib/locked-error-text.js +47 -0
  408. package/lib/locked-error-text.js.map +1 -0
  409. package/lib/login-failure.d.ts +59 -0
  410. package/lib/login-failure.d.ts.map +1 -0
  411. package/lib/login-failure.js +70 -0
  412. package/lib/login-failure.js.map +1 -0
  413. package/lib/login.d.ts +169 -0
  414. package/lib/login.d.ts.map +1 -0
  415. package/lib/login.js +662 -0
  416. package/lib/login.js.map +1 -0
  417. package/lib/loomy-adapter.d.ts +461 -0
  418. package/lib/loomy-adapter.d.ts.map +1 -0
  419. package/lib/loomy-adapter.js +1148 -0
  420. package/lib/loomy-adapter.js.map +1 -0
  421. package/lib/loomy-auth.d.ts +239 -0
  422. package/lib/loomy-auth.d.ts.map +1 -0
  423. package/lib/loomy-auth.js +441 -0
  424. package/lib/loomy-auth.js.map +1 -0
  425. package/lib/loomy-balance-rank.d.ts +96 -0
  426. package/lib/loomy-balance-rank.d.ts.map +1 -0
  427. package/lib/loomy-balance-rank.js +95 -0
  428. package/lib/loomy-balance-rank.js.map +1 -0
  429. package/lib/loomy-balance-selector.d.ts +193 -0
  430. package/lib/loomy-balance-selector.d.ts.map +1 -0
  431. package/lib/loomy-balance-selector.js +190 -0
  432. package/lib/loomy-balance-selector.js.map +1 -0
  433. package/lib/loomy-credits.d.ts +96 -0
  434. package/lib/loomy-credits.d.ts.map +1 -0
  435. package/lib/loomy-credits.js +212 -0
  436. package/lib/loomy-credits.js.map +1 -0
  437. package/lib/loomy-oauth.d.ts +102 -0
  438. package/lib/loomy-oauth.d.ts.map +1 -0
  439. package/lib/loomy-oauth.js +240 -0
  440. package/lib/loomy-oauth.js.map +1 -0
  441. package/lib/loomy-onboarding.d.ts +92 -0
  442. package/lib/loomy-onboarding.d.ts.map +1 -0
  443. package/lib/loomy-onboarding.js +175 -0
  444. package/lib/loomy-onboarding.js.map +1 -0
  445. package/lib/loomy-product.d.ts +245 -0
  446. package/lib/loomy-product.d.ts.map +1 -0
  447. package/lib/loomy-product.js +271 -0
  448. package/lib/loomy-product.js.map +1 -0
  449. package/lib/loomy-sign.d.ts +57 -0
  450. package/lib/loomy-sign.d.ts.map +1 -0
  451. package/lib/loomy-sign.js +129 -0
  452. package/lib/loomy-sign.js.map +1 -0
  453. package/lib/loomy-wechat-login.d.ts +84 -0
  454. package/lib/loomy-wechat-login.d.ts.map +1 -0
  455. package/lib/loomy-wechat-login.js +434 -0
  456. package/lib/loomy-wechat-login.js.map +1 -0
  457. package/lib/loomy-wechat.d.ts +151 -0
  458. package/lib/loomy-wechat.d.ts.map +1 -0
  459. package/lib/loomy-wechat.js +275 -0
  460. package/lib/loomy-wechat.js.map +1 -0
  461. package/lib/loomy.d.ts +151 -0
  462. package/lib/loomy.d.ts.map +1 -0
  463. package/lib/loomy.js +187 -0
  464. package/lib/loomy.js.map +1 -0
  465. package/lib/loop-recovery.d.ts +276 -0
  466. package/lib/loop-recovery.d.ts.map +1 -0
  467. package/lib/loop-recovery.js +371 -0
  468. package/lib/loop-recovery.js.map +1 -0
  469. package/lib/message-shape.d.ts +89 -0
  470. package/lib/message-shape.d.ts.map +1 -0
  471. package/lib/message-shape.js +127 -0
  472. package/lib/message-shape.js.map +1 -0
  473. package/lib/minimax-adapter.d.ts +337 -0
  474. package/lib/minimax-adapter.d.ts.map +1 -0
  475. package/lib/minimax-adapter.js +1111 -0
  476. package/lib/minimax-adapter.js.map +1 -0
  477. package/lib/minimax-auth.d.ts +504 -0
  478. package/lib/minimax-auth.d.ts.map +1 -0
  479. package/lib/minimax-auth.js +1440 -0
  480. package/lib/minimax-auth.js.map +1 -0
  481. package/lib/minimax-credits.d.ts +202 -0
  482. package/lib/minimax-credits.d.ts.map +1 -0
  483. package/lib/minimax-credits.js +658 -0
  484. package/lib/minimax-credits.js.map +1 -0
  485. package/lib/minimax-dedup.d.ts +90 -0
  486. package/lib/minimax-dedup.d.ts.map +1 -0
  487. package/lib/minimax-dedup.js +146 -0
  488. package/lib/minimax-dedup.js.map +1 -0
  489. package/lib/minimax-identity.d.ts +98 -0
  490. package/lib/minimax-identity.d.ts.map +1 -0
  491. package/lib/minimax-identity.js +165 -0
  492. package/lib/minimax-identity.js.map +1 -0
  493. package/lib/minimax-messages.d.ts +149 -0
  494. package/lib/minimax-messages.d.ts.map +1 -0
  495. package/lib/minimax-messages.js +809 -0
  496. package/lib/minimax-messages.js.map +1 -0
  497. package/lib/minimax-oauth.d.ts +151 -0
  498. package/lib/minimax-oauth.d.ts.map +1 -0
  499. package/lib/minimax-oauth.js +407 -0
  500. package/lib/minimax-oauth.js.map +1 -0
  501. package/lib/minimax-product.d.ts +265 -0
  502. package/lib/minimax-product.d.ts.map +1 -0
  503. package/lib/minimax-product.js +277 -0
  504. package/lib/minimax-product.js.map +1 -0
  505. package/lib/minimax-proxy.d.ts +138 -0
  506. package/lib/minimax-proxy.d.ts.map +1 -0
  507. package/lib/minimax-proxy.js +147 -0
  508. package/lib/minimax-proxy.js.map +1 -0
  509. package/lib/minimax-refresh-journal.d.ts +43 -0
  510. package/lib/minimax-refresh-journal.d.ts.map +1 -0
  511. package/lib/minimax-refresh-journal.js +103 -0
  512. package/lib/minimax-refresh-journal.js.map +1 -0
  513. package/lib/minimax-rpc.d.ts +83 -0
  514. package/lib/minimax-rpc.d.ts.map +1 -0
  515. package/lib/minimax-rpc.js +215 -0
  516. package/lib/minimax-rpc.js.map +1 -0
  517. package/lib/minimax.d.ts +513 -0
  518. package/lib/minimax.d.ts.map +1 -0
  519. package/lib/minimax.js +765 -0
  520. package/lib/minimax.js.map +1 -0
  521. package/lib/model-catalog.d.ts +497 -0
  522. package/lib/model-catalog.d.ts.map +1 -0
  523. package/lib/model-catalog.js +576 -0
  524. package/lib/model-catalog.js.map +1 -0
  525. package/lib/model-gate.d.ts +124 -0
  526. package/lib/model-gate.d.ts.map +1 -0
  527. package/lib/model-gate.js +184 -0
  528. package/lib/model-gate.js.map +1 -0
  529. package/lib/model-queue.d.ts +235 -0
  530. package/lib/model-queue.d.ts.map +1 -0
  531. package/lib/model-queue.js +310 -0
  532. package/lib/model-queue.js.map +1 -0
  533. package/lib/models-dev-cache.d.ts +279 -0
  534. package/lib/models-dev-cache.d.ts.map +1 -0
  535. package/lib/models-dev-cache.js +664 -0
  536. package/lib/models-dev-cache.js.map +1 -0
  537. package/lib/models.d.ts +153 -0
  538. package/lib/models.d.ts.map +1 -0
  539. package/lib/models.js +499 -0
  540. package/lib/models.js.map +1 -0
  541. package/lib/modelscope-adapter.d.ts +276 -0
  542. package/lib/modelscope-adapter.d.ts.map +1 -0
  543. package/lib/modelscope-adapter.js +671 -0
  544. package/lib/modelscope-adapter.js.map +1 -0
  545. package/lib/modelscope-auth.d.ts +130 -0
  546. package/lib/modelscope-auth.d.ts.map +1 -0
  547. package/lib/modelscope-auth.js +234 -0
  548. package/lib/modelscope-auth.js.map +1 -0
  549. package/lib/modelscope-credits.d.ts +74 -0
  550. package/lib/modelscope-credits.d.ts.map +1 -0
  551. package/lib/modelscope-credits.js +163 -0
  552. package/lib/modelscope-credits.js.map +1 -0
  553. package/lib/modelscope-messages.d.ts +96 -0
  554. package/lib/modelscope-messages.d.ts.map +1 -0
  555. package/lib/modelscope-messages.js +97 -0
  556. package/lib/modelscope-messages.js.map +1 -0
  557. package/lib/modelscope-product.d.ts +195 -0
  558. package/lib/modelscope-product.d.ts.map +1 -0
  559. package/lib/modelscope-product.js +309 -0
  560. package/lib/modelscope-product.js.map +1 -0
  561. package/lib/modelscope-rpc.d.ts +98 -0
  562. package/lib/modelscope-rpc.d.ts.map +1 -0
  563. package/lib/modelscope-rpc.js +192 -0
  564. package/lib/modelscope-rpc.js.map +1 -0
  565. package/lib/modelscope.d.ts +150 -0
  566. package/lib/modelscope.d.ts.map +1 -0
  567. package/lib/modelscope.js +169 -0
  568. package/lib/modelscope.js.map +1 -0
  569. package/lib/native-search-contract.d.ts +162 -0
  570. package/lib/native-search-contract.d.ts.map +1 -0
  571. package/lib/native-search-contract.js +123 -0
  572. package/lib/native-search-contract.js.map +1 -0
  573. package/lib/network-hint.d.ts +143 -0
  574. package/lib/network-hint.d.ts.map +1 -0
  575. package/lib/network-hint.js +224 -0
  576. package/lib/network-hint.js.map +1 -0
  577. package/lib/oauth.d.ts +101 -0
  578. package/lib/oauth.d.ts.map +1 -0
  579. package/lib/oauth.js +193 -0
  580. package/lib/oauth.js.map +1 -0
  581. package/lib/officeace-adapter.d.ts +260 -0
  582. package/lib/officeace-adapter.d.ts.map +1 -0
  583. package/lib/officeace-adapter.js +703 -0
  584. package/lib/officeace-adapter.js.map +1 -0
  585. package/lib/officeace-auth.d.ts +448 -0
  586. package/lib/officeace-auth.d.ts.map +1 -0
  587. package/lib/officeace-auth.js +1590 -0
  588. package/lib/officeace-auth.js.map +1 -0
  589. package/lib/officeace-credential-health.d.ts +180 -0
  590. package/lib/officeace-credential-health.d.ts.map +1 -0
  591. package/lib/officeace-credential-health.js +245 -0
  592. package/lib/officeace-credential-health.js.map +1 -0
  593. package/lib/officeace-lock.d.ts +218 -0
  594. package/lib/officeace-lock.d.ts.map +1 -0
  595. package/lib/officeace-lock.js +259 -0
  596. package/lib/officeace-lock.js.map +1 -0
  597. package/lib/officeace-product.d.ts +163 -0
  598. package/lib/officeace-product.d.ts.map +1 -0
  599. package/lib/officeace-product.js +127 -0
  600. package/lib/officeace-product.js.map +1 -0
  601. package/lib/openai-compat.d.ts +236 -0
  602. package/lib/openai-compat.d.ts.map +1 -0
  603. package/lib/openai-compat.js +1454 -0
  604. package/lib/openai-compat.js.map +1 -0
  605. package/lib/openai-gateway/auth.d.ts +32 -0
  606. package/lib/openai-gateway/auth.d.ts.map +1 -0
  607. package/lib/openai-gateway/auth.js +67 -0
  608. package/lib/openai-gateway/auth.js.map +1 -0
  609. package/lib/openai-gateway/channel.d.ts +48 -0
  610. package/lib/openai-gateway/channel.d.ts.map +1 -0
  611. package/lib/openai-gateway/channel.js +63 -0
  612. package/lib/openai-gateway/channel.js.map +1 -0
  613. package/lib/openai-gateway/config.d.ts +124 -0
  614. package/lib/openai-gateway/config.d.ts.map +1 -0
  615. package/lib/openai-gateway/config.js +443 -0
  616. package/lib/openai-gateway/config.js.map +1 -0
  617. package/lib/openai-gateway/effort-view.d.ts +69 -0
  618. package/lib/openai-gateway/effort-view.d.ts.map +1 -0
  619. package/lib/openai-gateway/effort-view.js +86 -0
  620. package/lib/openai-gateway/effort-view.js.map +1 -0
  621. package/lib/openai-gateway/images.d.ts +107 -0
  622. package/lib/openai-gateway/images.d.ts.map +1 -0
  623. package/lib/openai-gateway/images.js +154 -0
  624. package/lib/openai-gateway/images.js.map +1 -0
  625. package/lib/openai-gateway/index.d.ts +25 -0
  626. package/lib/openai-gateway/index.d.ts.map +1 -0
  627. package/lib/openai-gateway/index.js +91 -0
  628. package/lib/openai-gateway/index.js.map +1 -0
  629. package/lib/openai-gateway/messages.d.ts +226 -0
  630. package/lib/openai-gateway/messages.d.ts.map +1 -0
  631. package/lib/openai-gateway/messages.js +602 -0
  632. package/lib/openai-gateway/messages.js.map +1 -0
  633. package/lib/openai-gateway/model-errors.d.ts +103 -0
  634. package/lib/openai-gateway/model-errors.d.ts.map +1 -0
  635. package/lib/openai-gateway/model-errors.js +144 -0
  636. package/lib/openai-gateway/model-errors.js.map +1 -0
  637. package/lib/openai-gateway/models.d.ts +125 -0
  638. package/lib/openai-gateway/models.d.ts.map +1 -0
  639. package/lib/openai-gateway/models.js +145 -0
  640. package/lib/openai-gateway/models.js.map +1 -0
  641. package/lib/openai-gateway/responses.d.ts +181 -0
  642. package/lib/openai-gateway/responses.d.ts.map +1 -0
  643. package/lib/openai-gateway/responses.js +1482 -0
  644. package/lib/openai-gateway/responses.js.map +1 -0
  645. package/lib/openai-gateway/runtime.d.ts +99 -0
  646. package/lib/openai-gateway/runtime.d.ts.map +1 -0
  647. package/lib/openai-gateway/runtime.js +454 -0
  648. package/lib/openai-gateway/runtime.js.map +1 -0
  649. package/lib/openai-gateway/server.d.ts +190 -0
  650. package/lib/openai-gateway/server.d.ts.map +1 -0
  651. package/lib/openai-gateway/server.js +940 -0
  652. package/lib/openai-gateway/server.js.map +1 -0
  653. package/lib/openai-gateway/stream.d.ts +24 -0
  654. package/lib/openai-gateway/stream.d.ts.map +1 -0
  655. package/lib/openai-gateway/stream.js +261 -0
  656. package/lib/openai-gateway/stream.js.map +1 -0
  657. package/lib/openai-gateway/tencent-fingerprint.d.ts +172 -0
  658. package/lib/openai-gateway/tencent-fingerprint.d.ts.map +1 -0
  659. package/lib/openai-gateway/tencent-fingerprint.js +432 -0
  660. package/lib/openai-gateway/tencent-fingerprint.js.map +1 -0
  661. package/lib/openai-gateway/usage.d.ts +105 -0
  662. package/lib/openai-gateway/usage.d.ts.map +1 -0
  663. package/lib/openai-gateway/usage.js +113 -0
  664. package/lib/openai-gateway/usage.js.map +1 -0
  665. package/lib/opencode-adapter.d.ts +182 -0
  666. package/lib/opencode-adapter.d.ts.map +1 -0
  667. package/lib/opencode-adapter.js +675 -0
  668. package/lib/opencode-adapter.js.map +1 -0
  669. package/lib/opencode-auth.d.ts +149 -0
  670. package/lib/opencode-auth.d.ts.map +1 -0
  671. package/lib/opencode-auth.js +193 -0
  672. package/lib/opencode-auth.js.map +1 -0
  673. package/lib/opencode-capability.d.ts +168 -0
  674. package/lib/opencode-capability.d.ts.map +1 -0
  675. package/lib/opencode-capability.js +315 -0
  676. package/lib/opencode-capability.js.map +1 -0
  677. package/lib/opencode-messages.d.ts +65 -0
  678. package/lib/opencode-messages.d.ts.map +1 -0
  679. package/lib/opencode-messages.js +162 -0
  680. package/lib/opencode-messages.js.map +1 -0
  681. package/lib/opencode-product.d.ts +196 -0
  682. package/lib/opencode-product.d.ts.map +1 -0
  683. package/lib/opencode-product.js +363 -0
  684. package/lib/opencode-product.js.map +1 -0
  685. package/lib/opencode-proxy.d.ts +124 -0
  686. package/lib/opencode-proxy.d.ts.map +1 -0
  687. package/lib/opencode-proxy.js +380 -0
  688. package/lib/opencode-proxy.js.map +1 -0
  689. package/lib/opencode-rpc.d.ts +110 -0
  690. package/lib/opencode-rpc.d.ts.map +1 -0
  691. package/lib/opencode-rpc.js +436 -0
  692. package/lib/opencode-rpc.js.map +1 -0
  693. package/lib/opencode-stream.d.ts +14 -0
  694. package/lib/opencode-stream.d.ts.map +1 -0
  695. package/lib/opencode-stream.js +359 -0
  696. package/lib/opencode-stream.js.map +1 -0
  697. package/lib/opencode.d.ts +75 -0
  698. package/lib/opencode.d.ts.map +1 -0
  699. package/lib/opencode.js +164 -0
  700. package/lib/opencode.js.map +1 -0
  701. package/lib/permanent-lock-store.d.ts +65 -0
  702. package/lib/permanent-lock-store.d.ts.map +1 -0
  703. package/lib/permanent-lock-store.js +116 -0
  704. package/lib/permanent-lock-store.js.map +1 -0
  705. package/lib/product.d.ts +240 -0
  706. package/lib/product.d.ts.map +1 -0
  707. package/lib/product.js +406 -0
  708. package/lib/product.js.map +1 -0
  709. package/lib/provider-credits.d.ts +163 -0
  710. package/lib/provider-credits.d.ts.map +1 -0
  711. package/lib/provider-credits.js +806 -0
  712. package/lib/provider-credits.js.map +1 -0
  713. package/lib/provider-expiry.d.ts +135 -0
  714. package/lib/provider-expiry.d.ts.map +1 -0
  715. package/lib/provider-expiry.js +293 -0
  716. package/lib/provider-expiry.js.map +1 -0
  717. package/lib/provider-onboarding.d.ts +93 -0
  718. package/lib/provider-onboarding.d.ts.map +1 -0
  719. package/lib/provider-onboarding.js +169 -0
  720. package/lib/provider-onboarding.js.map +1 -0
  721. package/lib/provider-registry.d.ts +159 -0
  722. package/lib/provider-registry.d.ts.map +1 -0
  723. package/lib/provider-registry.js +925 -0
  724. package/lib/provider-registry.js.map +1 -0
  725. package/lib/provider-runtime.d.ts +811 -0
  726. package/lib/provider-runtime.d.ts.map +1 -0
  727. package/lib/provider-runtime.js +196 -0
  728. package/lib/provider-runtime.js.map +1 -0
  729. package/lib/proxy-mask.d.ts +27 -0
  730. package/lib/proxy-mask.d.ts.map +1 -0
  731. package/lib/proxy-mask.js +29 -0
  732. package/lib/proxy-mask.js.map +1 -0
  733. package/lib/qoder-adapter.d.ts +787 -0
  734. package/lib/qoder-adapter.d.ts.map +1 -0
  735. package/lib/qoder-adapter.js +1897 -0
  736. package/lib/qoder-adapter.js.map +1 -0
  737. package/lib/qoder-auth-wasm.wasm +0 -0
  738. package/lib/qoder-auth.d.ts +300 -0
  739. package/lib/qoder-auth.d.ts.map +1 -0
  740. package/lib/qoder-auth.js +560 -0
  741. package/lib/qoder-auth.js.map +1 -0
  742. package/lib/qoder-catalog.d.ts +139 -0
  743. package/lib/qoder-catalog.d.ts.map +1 -0
  744. package/lib/qoder-catalog.js +525 -0
  745. package/lib/qoder-catalog.js.map +1 -0
  746. package/lib/qoder-credits.d.ts +434 -0
  747. package/lib/qoder-credits.d.ts.map +1 -0
  748. package/lib/qoder-credits.js +1029 -0
  749. package/lib/qoder-credits.js.map +1 -0
  750. package/lib/qoder-envelope.d.ts +15 -0
  751. package/lib/qoder-envelope.d.ts.map +1 -0
  752. package/lib/qoder-envelope.js +203 -0
  753. package/lib/qoder-envelope.js.map +1 -0
  754. package/lib/qoder-machine.d.ts +166 -0
  755. package/lib/qoder-machine.d.ts.map +1 -0
  756. package/lib/qoder-machine.js +499 -0
  757. package/lib/qoder-machine.js.map +1 -0
  758. package/lib/qoder-oauth.d.ts +89 -0
  759. package/lib/qoder-oauth.d.ts.map +1 -0
  760. package/lib/qoder-oauth.js +179 -0
  761. package/lib/qoder-oauth.js.map +1 -0
  762. package/lib/qoder-product.d.ts +414 -0
  763. package/lib/qoder-product.d.ts.map +1 -0
  764. package/lib/qoder-product.js +378 -0
  765. package/lib/qoder-product.js.map +1 -0
  766. package/lib/qoder-proxy.d.ts +92 -0
  767. package/lib/qoder-proxy.d.ts.map +1 -0
  768. package/lib/qoder-proxy.js +131 -0
  769. package/lib/qoder-proxy.js.map +1 -0
  770. package/lib/qoder-rpc.d.ts +81 -0
  771. package/lib/qoder-rpc.d.ts.map +1 -0
  772. package/lib/qoder-rpc.js +167 -0
  773. package/lib/qoder-rpc.js.map +1 -0
  774. package/lib/qoder-wasm.d.ts +372 -0
  775. package/lib/qoder-wasm.d.ts.map +1 -0
  776. package/lib/qoder-wasm.js +836 -0
  777. package/lib/qoder-wasm.js.map +1 -0
  778. package/lib/qoder.d.ts +203 -0
  779. package/lib/qoder.d.ts.map +1 -0
  780. package/lib/qoder.js +311 -0
  781. package/lib/qoder.js.map +1 -0
  782. package/lib/raccoon-adapter.d.ts +349 -0
  783. package/lib/raccoon-adapter.d.ts.map +1 -0
  784. package/lib/raccoon-adapter.js +751 -0
  785. package/lib/raccoon-adapter.js.map +1 -0
  786. package/lib/raccoon-auth.d.ts +214 -0
  787. package/lib/raccoon-auth.d.ts.map +1 -0
  788. package/lib/raccoon-auth.js +552 -0
  789. package/lib/raccoon-auth.js.map +1 -0
  790. package/lib/raccoon-credits.d.ts +81 -0
  791. package/lib/raccoon-credits.d.ts.map +1 -0
  792. package/lib/raccoon-credits.js +208 -0
  793. package/lib/raccoon-credits.js.map +1 -0
  794. package/lib/raccoon-login-page.d.ts +84 -0
  795. package/lib/raccoon-login-page.d.ts.map +1 -0
  796. package/lib/raccoon-login-page.js +497 -0
  797. package/lib/raccoon-login-page.js.map +1 -0
  798. package/lib/raccoon-oauth.d.ts +110 -0
  799. package/lib/raccoon-oauth.d.ts.map +1 -0
  800. package/lib/raccoon-oauth.js +270 -0
  801. package/lib/raccoon-oauth.js.map +1 -0
  802. package/lib/raccoon-product.d.ts +293 -0
  803. package/lib/raccoon-product.d.ts.map +1 -0
  804. package/lib/raccoon-product.js +339 -0
  805. package/lib/raccoon-product.js.map +1 -0
  806. package/lib/raccoon-qr.d.ts +60 -0
  807. package/lib/raccoon-qr.d.ts.map +1 -0
  808. package/lib/raccoon-qr.js +521 -0
  809. package/lib/raccoon-qr.js.map +1 -0
  810. package/lib/raccoon.d.ts +197 -0
  811. package/lib/raccoon.d.ts.map +1 -0
  812. package/lib/raccoon.js +227 -0
  813. package/lib/raccoon.js.map +1 -0
  814. package/lib/reasoning-ladder.d.ts +120 -0
  815. package/lib/reasoning-ladder.d.ts.map +1 -0
  816. package/lib/reasoning-ladder.js +166 -0
  817. package/lib/reasoning-ladder.js.map +1 -0
  818. package/lib/refresh-failure.d.ts +129 -0
  819. package/lib/refresh-failure.d.ts.map +1 -0
  820. package/lib/refresh-failure.js +304 -0
  821. package/lib/refresh-failure.js.map +1 -0
  822. package/lib/refresh-scheduler.d.ts +130 -0
  823. package/lib/refresh-scheduler.d.ts.map +1 -0
  824. package/lib/refresh-scheduler.js +169 -0
  825. package/lib/refresh-scheduler.js.map +1 -0
  826. package/lib/refresh.d.ts +50 -0
  827. package/lib/refresh.d.ts.map +1 -0
  828. package/lib/refresh.js +168 -0
  829. package/lib/refresh.js.map +1 -0
  830. package/lib/remote-catalog-gate.d.ts +146 -0
  831. package/lib/remote-catalog-gate.d.ts.map +1 -0
  832. package/lib/remote-catalog-gate.js +188 -0
  833. package/lib/remote-catalog-gate.js.map +1 -0
  834. package/lib/retry-after.d.ts +48 -0
  835. package/lib/retry-after.d.ts.map +1 -0
  836. package/lib/retry-after.js +67 -0
  837. package/lib/retry-after.js.map +1 -0
  838. package/lib/serial-queue.d.ts +87 -0
  839. package/lib/serial-queue.d.ts.map +1 -0
  840. package/lib/serial-queue.js +117 -0
  841. package/lib/serial-queue.js.map +1 -0
  842. package/lib/service.d.ts +256 -0
  843. package/lib/service.d.ts.map +1 -0
  844. package/lib/service.js +568 -0
  845. package/lib/service.js.map +1 -0
  846. package/lib/session-title.d.ts +165 -0
  847. package/lib/session-title.d.ts.map +1 -0
  848. package/lib/session-title.js +163 -0
  849. package/lib/session-title.js.map +1 -0
  850. package/lib/settings-compat.d.ts +83 -0
  851. package/lib/settings-compat.d.ts.map +1 -0
  852. package/lib/settings-compat.js +95 -0
  853. package/lib/settings-compat.js.map +1 -0
  854. package/lib/sign.d.ts +7 -0
  855. package/lib/sign.d.ts.map +1 -0
  856. package/lib/sign.js +52 -0
  857. package/lib/sign.js.map +1 -0
  858. package/lib/sse.d.ts +932 -0
  859. package/lib/sse.d.ts.map +1 -0
  860. package/lib/sse.js +1519 -0
  861. package/lib/sse.js.map +1 -0
  862. package/lib/stepcode-adapter.d.ts +150 -0
  863. package/lib/stepcode-adapter.d.ts.map +1 -0
  864. package/lib/stepcode-adapter.js +303 -0
  865. package/lib/stepcode-adapter.js.map +1 -0
  866. package/lib/stepcode-auth.d.ts +154 -0
  867. package/lib/stepcode-auth.d.ts.map +1 -0
  868. package/lib/stepcode-auth.js +287 -0
  869. package/lib/stepcode-auth.js.map +1 -0
  870. package/lib/stepcode-oauth.d.ts +194 -0
  871. package/lib/stepcode-oauth.d.ts.map +1 -0
  872. package/lib/stepcode-oauth.js +496 -0
  873. package/lib/stepcode-oauth.js.map +1 -0
  874. package/lib/stepcode-product.d.ts +255 -0
  875. package/lib/stepcode-product.d.ts.map +1 -0
  876. package/lib/stepcode-product.js +256 -0
  877. package/lib/stepcode-product.js.map +1 -0
  878. package/lib/stepcode.d.ts +230 -0
  879. package/lib/stepcode.d.ts.map +1 -0
  880. package/lib/stepcode.js +300 -0
  881. package/lib/stepcode.js.map +1 -0
  882. package/lib/teleagent-adapter.d.ts +108 -0
  883. package/lib/teleagent-adapter.d.ts.map +1 -0
  884. package/lib/teleagent-adapter.js +278 -0
  885. package/lib/teleagent-adapter.js.map +1 -0
  886. package/lib/teleagent-auth.d.ts +279 -0
  887. package/lib/teleagent-auth.d.ts.map +1 -0
  888. package/lib/teleagent-auth.js +512 -0
  889. package/lib/teleagent-auth.js.map +1 -0
  890. package/lib/teleagent-cdp-login.d.ts +100 -0
  891. package/lib/teleagent-cdp-login.d.ts.map +1 -0
  892. package/lib/teleagent-cdp-login.js +402 -0
  893. package/lib/teleagent-cdp-login.js.map +1 -0
  894. package/lib/teleagent-credits.d.ts +120 -0
  895. package/lib/teleagent-credits.d.ts.map +1 -0
  896. package/lib/teleagent-credits.js +288 -0
  897. package/lib/teleagent-credits.js.map +1 -0
  898. package/lib/teleagent-product.d.ts +182 -0
  899. package/lib/teleagent-product.d.ts.map +1 -0
  900. package/lib/teleagent-product.js +172 -0
  901. package/lib/teleagent-product.js.map +1 -0
  902. package/lib/teleagent.d.ts +268 -0
  903. package/lib/teleagent.d.ts.map +1 -0
  904. package/lib/teleagent.js +422 -0
  905. package/lib/teleagent.js.map +1 -0
  906. package/lib/token-ledger-store.d.ts +76 -0
  907. package/lib/token-ledger-store.d.ts.map +1 -0
  908. package/lib/token-ledger-store.js +730 -0
  909. package/lib/token-ledger-store.js.map +1 -0
  910. package/lib/token-ledger.d.ts +433 -0
  911. package/lib/token-ledger.d.ts.map +1 -0
  912. package/lib/token-ledger.js +831 -0
  913. package/lib/token-ledger.js.map +1 -0
  914. package/lib/trae-adapter.d.ts +471 -0
  915. package/lib/trae-adapter.d.ts.map +1 -0
  916. package/lib/trae-adapter.js +2143 -0
  917. package/lib/trae-adapter.js.map +1 -0
  918. package/lib/trae-auth.d.ts +244 -0
  919. package/lib/trae-auth.d.ts.map +1 -0
  920. package/lib/trae-auth.js +623 -0
  921. package/lib/trae-auth.js.map +1 -0
  922. package/lib/trae-cooldown-table.d.ts +18 -0
  923. package/lib/trae-cooldown-table.d.ts.map +1 -0
  924. package/lib/trae-cooldown-table.js +36 -0
  925. package/lib/trae-cooldown-table.js.map +1 -0
  926. package/lib/trae-credits.d.ts +103 -0
  927. package/lib/trae-credits.d.ts.map +1 -0
  928. package/lib/trae-credits.js +346 -0
  929. package/lib/trae-credits.js.map +1 -0
  930. package/lib/trae-errors.d.ts +144 -0
  931. package/lib/trae-errors.d.ts.map +1 -0
  932. package/lib/trae-errors.js +210 -0
  933. package/lib/trae-errors.js.map +1 -0
  934. package/lib/trae-lottery.d.ts +205 -0
  935. package/lib/trae-lottery.d.ts.map +1 -0
  936. package/lib/trae-lottery.js +386 -0
  937. package/lib/trae-lottery.js.map +1 -0
  938. package/lib/trae-oauth.d.ts +224 -0
  939. package/lib/trae-oauth.d.ts.map +1 -0
  940. package/lib/trae-oauth.js +648 -0
  941. package/lib/trae-oauth.js.map +1 -0
  942. package/lib/trae-product.d.ts +242 -0
  943. package/lib/trae-product.d.ts.map +1 -0
  944. package/lib/trae-product.js +179 -0
  945. package/lib/trae-product.js.map +1 -0
  946. package/lib/trae.d.ts +907 -0
  947. package/lib/trae.d.ts.map +1 -0
  948. package/lib/trae.js +1621 -0
  949. package/lib/trae.js.map +1 -0
  950. package/lib/ttl-cache.d.ts +132 -0
  951. package/lib/ttl-cache.d.ts.map +1 -0
  952. package/lib/ttl-cache.js +151 -0
  953. package/lib/ttl-cache.js.map +1 -0
  954. package/lib/types.d.ts +2366 -0
  955. package/lib/types.d.ts.map +1 -0
  956. package/lib/types.js +10 -0
  957. package/lib/types.js.map +1 -0
  958. package/lib/usage-badge.d.ts +129 -0
  959. package/lib/usage-badge.d.ts.map +1 -0
  960. package/lib/usage-badge.js +227 -0
  961. package/lib/usage-badge.js.map +1 -0
  962. package/lib/web-native.d.ts +102 -0
  963. package/lib/web-native.d.ts.map +1 -0
  964. package/lib/web-native.js +301 -0
  965. package/lib/web-native.js.map +1 -0
  966. package/lib/zcode-adapter.d.ts +745 -0
  967. package/lib/zcode-adapter.d.ts.map +1 -0
  968. package/lib/zcode-adapter.js +1973 -0
  969. package/lib/zcode-adapter.js.map +1 -0
  970. package/lib/zcode-anthropic.d.ts +178 -0
  971. package/lib/zcode-anthropic.d.ts.map +1 -0
  972. package/lib/zcode-anthropic.js +784 -0
  973. package/lib/zcode-anthropic.js.map +1 -0
  974. package/lib/zcode-auth.d.ts +1043 -0
  975. package/lib/zcode-auth.d.ts.map +1 -0
  976. package/lib/zcode-auth.js +2122 -0
  977. package/lib/zcode-auth.js.map +1 -0
  978. package/lib/zcode-captcha.d.ts +611 -0
  979. package/lib/zcode-captcha.d.ts.map +1 -0
  980. package/lib/zcode-captcha.js +990 -0
  981. package/lib/zcode-captcha.js.map +1 -0
  982. package/lib/zcode-carrier-page.d.ts +49 -0
  983. package/lib/zcode-carrier-page.d.ts.map +1 -0
  984. package/lib/zcode-carrier-page.js +87 -0
  985. package/lib/zcode-carrier-page.js.map +1 -0
  986. package/lib/zcode-diagnostics.d.ts +420 -0
  987. package/lib/zcode-diagnostics.d.ts.map +1 -0
  988. package/lib/zcode-diagnostics.js +709 -0
  989. package/lib/zcode-diagnostics.js.map +1 -0
  990. package/lib/zcode-entitlements.d.ts +260 -0
  991. package/lib/zcode-entitlements.d.ts.map +1 -0
  992. package/lib/zcode-entitlements.js +361 -0
  993. package/lib/zcode-entitlements.js.map +1 -0
  994. package/lib/zcode-identity.d.ts +222 -0
  995. package/lib/zcode-identity.d.ts.map +1 -0
  996. package/lib/zcode-identity.js +358 -0
  997. package/lib/zcode-identity.js.map +1 -0
  998. package/lib/zcode-login.d.ts +178 -0
  999. package/lib/zcode-login.d.ts.map +1 -0
  1000. package/lib/zcode-login.js +354 -0
  1001. package/lib/zcode-login.js.map +1 -0
  1002. package/lib/zcode-product.d.ts +183 -0
  1003. package/lib/zcode-product.d.ts.map +1 -0
  1004. package/lib/zcode-product.js +219 -0
  1005. package/lib/zcode-product.js.map +1 -0
  1006. package/lib/zcode-transport.d.ts +127 -0
  1007. package/lib/zcode-transport.d.ts.map +1 -0
  1008. package/lib/zcode-transport.js +269 -0
  1009. package/lib/zcode-transport.js.map +1 -0
  1010. package/lib/zcode-upstream.d.ts +605 -0
  1011. package/lib/zcode-upstream.d.ts.map +1 -0
  1012. package/lib/zcode-upstream.js +1259 -0
  1013. package/lib/zcode-upstream.js.map +1 -0
  1014. package/lib/zcode.d.ts +157 -0
  1015. package/lib/zcode.d.ts.map +1 -0
  1016. package/lib/zcode.js +100 -0
  1017. package/lib/zcode.js.map +1 -0
  1018. package/lib/zero-output-guard.d.ts +147 -0
  1019. package/lib/zero-output-guard.d.ts.map +1 -0
  1020. package/lib/zero-output-guard.js +147 -0
  1021. package/lib/zero-output-guard.js.map +1 -0
  1022. package/locale/en.json +6 -0
  1023. package/locale/zh.json +6 -0
  1024. package/package.json +136 -4
package/README.md CHANGED
@@ -1,3 +1,936 @@
1
- # Temporary Holding Version
1
+ # dsh-providers-hub
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > **本包原名 `dsh-codearts-auth`**(`0.2.0-rc.11` 起改名)。老用户的 DSH profile 里
4
+ > 还锁着旧名时,**插件会加载失败并被自动禁用**(宿主报 `N entry did not activate`,
5
+ > 界面里也就看不到它)—— 升级前先看
6
+ > [⚠️ 从旧包名 `dsh-codearts-auth` 升级](#️-从旧包名-dsh-codearts-auth-升级)。
7
+
8
+ > **使用声明**:本项目仅供学习研究使用,请遵守各服务提供方的服务条款。
9
+
10
+ deepseek-harness 插件:统一管理多个 AI 编程服务的账号,并把它们的模型接进 DSH
11
+ 的模型选择器。支持**多账号池**(同一服务登录多个账号,按可用性自动选号)与
12
+ **凭据静默续期**(到期前自动刷新,无需再次打开浏览器)。
13
+
14
+ - **17 个 provider 路由**,外加 1 个**聚合**路由(见下)
15
+ - 登录、状态、续期、积分领取**全部在 Jet Hub 设置页完成**,不注册任何斜杠命令
16
+ - 附带一个**本机 OpenAI 兼容网关**,供其它客户端复用已登录账号
17
+
18
+ > 📌 **本 README 只写「怎么用」。** 各 provider 的协议、端点、登录流程、请求头
19
+ > 构造、实测数据与事故史等**实现细节**,统一记录在不入库的内部文档
20
+ > `docs/implementation-notes.md` 中。需要改动实现或排查协议问题时读它。
21
+ >
22
+ > ⚠️ **accio 的章节该文件里还没有**(`implementation-notes.md` 目前零处 accio)——
23
+ > 读它时**不要**以为 accio 没有实现笔记。accio 的实测结论与坑点当前登记在
24
+ > `docs/agent-notes/providers-accio.md`(含三条与参考实现相反的结论、两个真缺陷、
25
+ > 区域选择与接线陷阱),补写 `implementation-notes.md` 的 accio 章节是**独立任务**。
26
+
27
+ ---
28
+
29
+ ## 目录
30
+
31
+ - [安装](#安装)
32
+ - [用法](#用法)
33
+ - [支持的渠道](#支持的渠道)
34
+ - [聚合路由](#聚合路由aggregate)
35
+ - [本机 OpenAI 网关](#本机-openai-网关)
36
+ - [用量徽标与 Token 用量](#用量徽标与-token-用量)
37
+ - [配置项](#配置项)
38
+ - [开发](#开发)
39
+
40
+ ---
41
+
42
+ ## 安装
43
+
44
+ 该包尚未发布到 npm registry。提供两种安装方式。
45
+
46
+ ### ⚠️ 从旧包名 `dsh-codearts-auth` 升级
47
+
48
+ 本包在 `0.2.0-rc.11` 把包名从 `dsh-codearts-auth` 改成了 `dsh-providers-hub`。
49
+ **仓库里改完了不代表你的机器上改完了** —— DSH 是在 **profile** 里按**包名字符串**
50
+ 寻址 bundle 的,而老 profile 两处都还写着旧名:
51
+
52
+ ```jsonc
53
+ // ~/.dsh/profiles/<name>/package.json
54
+ {
55
+ "dependencies": { "dsh-codearts-auth": "link:…" }, // ← 旧键
56
+ "dsh": { "profile": { "bundles": [ …, "dsh-codearts-auth" ] } } // ← 旧项
57
+ }
58
+ ```
59
+
60
+ **两处必须一起改**,缺一处就是静默失效 —— 而且**「两处都不改」同样会坏**,
61
+ 只是坏的位置不同:
62
+
63
+ | profile 里的状态 | 后果 |
64
+ |---|---|
65
+ | **两处都是旧名**(老 profile 的现状) | bundle 目录**解析得到**(`node_modules/dsh-codearts-auth` 这个旧名别名还在),但包里 patch 的加载行写的是**新包名**,而宿主把加载行的解析基准设成 **profile 目录** ⇒ 新名在那里解析不到(本机实测 `MODULE_NOT_FOUND`)⇒ **该加载行 import 失败** ⇒ 宿主报 `N entry did not activate`,桌面端落进恢复模式并把插件**自动禁用**(Jet Hub 界面自然也不出现,即 issue IKLUME 的症状) |
66
+ | **只改 `dependencies`** | `dsh.profile.bundles[]` 里的旧名在 profile 里解析不到 ⇒ `resolveBundleDir()` 抛错 ⇒ 该 bundle 进 `skippedBundles` ⇒ **整个插件(连宿主侧)都不加载**,只在 stderr 留一行:无异常、无 UI 提示 |
67
+ | **只改 `dsh.profile.bundles`** | 与上一格同因:`node_modules/` 里只有旧名,`bundles[]` 里的新名解析不到 ⇒ 同样进 `skippedBundles` |
68
+
69
+ > **实测**(本机 `~/.dsh/profiles/web`):`require.resolve('dsh-codearts-auth/package.json')`
70
+ > 成功解析到仓库根,而 `require.resolve('dsh-providers-hub/package.json')` 报
71
+ > `MODULE_NOT_FOUND`。宿主把加载行的解析基准设成 **profile 目录**
72
+ > (`dsh-app-boot` 对 patch 行调 `prepareProfilePatches(…, pathToFileURL(dirname(absoluteConfigPath))…)`,
73
+ > 同一个值也是 `boot()` 里 `ctx.baseUrl` 的来源),所以「旧名能解析」与「新名解析不到」
74
+ > 会**同时**成立 —— 这正是第一格的判断依据是**按名字解析**、而不是「目录在不在」的原因。
75
+ >
76
+ > ⚠️ 第一格的落点**不在客户端**:宿主**不会**替用户把这种行摘掉 —— `preflight()`
77
+ > 只在「兼容性冲突」时 deny 一行,其余失败**保留 cordis Loader 自己的诊断**
78
+ > (源码注释:*every other failure keeps the Loader's own diagnosis*),于是该行走进
79
+ > Loader 并**在宿主这一侧导入失败**。所以排障的第一现场是宿主日志里的
80
+ > `N entry did not activate` 与「插件已被禁用」,不是「宿主一切照常、只是客户端
81
+ > entry 没建立」——后者会让排查方向整个偏到前端产物上去。
82
+
83
+ 推荐做法是**不要手改**,直接用 `dsh plugin --profile <name>` 的 `remove` / `add`
84
+ 各走一遍,让工具自己写这两处:
85
+
86
+ ```sh
87
+ dsh plugin --profile <name> remove dsh-codearts-auth
88
+ dsh plugin --profile <name> add "https://gitee.com/iJetLi/deepseek-harness-codearts.git"
89
+ ```
90
+
91
+ ⚠️ `<name>` 要**逐个 profile 走一遍**:本机 `~/.dsh/profiles/` 下的 `desktop` /
92
+ `headless` / `tui` / `web` 四个 profile 的 `package.json` **都**还锁着旧名,且
93
+ `dsh.profile.bundles` 里也都有它。只有既无依赖项也无 `node_modules` 的 profile
94
+ (如 `default` / `rescue`)可以跳过。
95
+
96
+ ⚠️ 老版本可能残留 `node_modules/dsh-codearts-auth` 与 `pnpm-lock.yaml` 里的同名
97
+ 依赖项;`add` 之后确认 profile 里不再有旧名的依赖键。
98
+
99
+ ### 方式一:从 git 仓库安装(推荐)
100
+
101
+ `add` 以 git 仓库方式安装(pnpm 内部走 `git+https:` 协议),会运行本包的 `prepare`
102
+ 脚本自动构建 `lib/`,无需手动 `pnpm build`。
103
+
104
+ ⚠️ `prepare` **不依赖任何包管理器**(它直接内联 `tsc` / `node`):pnpm 在 clone
105
+ 目录里跑 `prepare` 时,**pnpm 10 / 11 不会把 npm 注入 PATH**(只有 pnpm ≥ 12 会)
106
+ ⇒ 若 `prepare` 里写 `npm run …`,那两代上安装会直接失败。
107
+
108
+ ⚠️ pnpm 10 起会拦截依赖的构建脚本,必须先在 profile 的 `pnpm-workspace.yaml`
109
+ (路径形如 `~/.dsh/profiles/<name>/pnpm-workspace.yaml`)里放行;而**放行键的写法
110
+ 在 pnpm 10 与 pnpm 11 之间互不兼容**,写错就装不上。
111
+
112
+ **1. 先跑一次安装**(这一次必然失败,为的是让 pnpm 打印它期望的键):
113
+
114
+ ```sh
115
+ dsh plugin --profile <name> add "https://gitee.com/iJetLi/deepseek-harness-codearts.git"
116
+ ```
117
+
118
+ **2. 按第 1 步的报错选一种写法,写进 profile 的 `pnpm-workspace.yaml`。**
119
+
120
+ 报 **`ERR_PNPM_INVALID_VERSION_UNION`** 的(**pnpm 10.x**)—— 只认**纯包名**键:
121
+
122
+ ```yaml
123
+ allowBuilds:
124
+ dsh-providers-hub: true
125
+ ```
126
+
127
+ 报 **`ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED`** 的(**pnpm 11.x**)—— git 托管包
128
+ **不认**纯包名键,必须用第 1 步 pnpm 打印的**完整键(含 `#<commit>`)**:
129
+
130
+ ```yaml
131
+ allowBuilds:
132
+ dsh-providers-hub@git+https://gitee.com/iJetLi/deepseek-harness-codearts.git#<第 1 步打印的 commit>: true
133
+ ```
134
+
135
+ **两代通用(省事,但放宽了权限)**:
136
+
137
+ ```yaml
138
+ dangerouslyAllowAllBuilds: true
139
+ ```
140
+
141
+ 它会放行该 profile 里**所有**依赖的构建脚本(不止本插件)。
142
+
143
+ **3. 重跑第 1 步的命令**:这次会拉取、构建并安装成功。之后每次升级重新 `add` 即可。
144
+
145
+ ⚠️ **不要**写 `dsh-providers-hub@git+https://gitee.com/…`(不带 `#<commit>`)——
146
+ 这个"看起来最自然"的键在两代 pnpm 上都不工作。
147
+
148
+ ⚠️ pnpm 11.x 的精确键里带 commit,因此**升级(重新 `add` 拉到新 commit)后该键
149
+ 失效**,按新报错里的键替换即可;用 `dangerouslyAllowAllBuilds` 则不必改。
150
+
151
+ ### 方式二:从源码目录安装(本地开发)
152
+
153
+ 先在本仓库中构建 `lib/`,再安装为 pnpm `link:` 依赖:
154
+
155
+ ```sh
156
+ pnpm build:all
157
+ dsh plugin --profile <name> install <path-to-this-repo>
158
+ ```
159
+
160
+ > `dsh plugin install` 以 `link:` 方式安装,pnpm 不会为 `link:` 依赖运行
161
+ > `prepare` 脚本,因此必须先手动执行 `pnpm build:all` 生成 `lib/`。
162
+ > 注意必须用 `build:all` 而非 `build`:后者只编译宿主侧,不产出
163
+ > `lib/client/jet-hub.js`。
164
+
165
+ 每次修改 `src/` 或 `plugin-src/` 后都需要重新执行 `pnpm build:all` —— dsh 启动时
166
+ 不会自动重建。
167
+
168
+ ### 通用说明
169
+
170
+ 该包声明了 `dsh.bundle` 补丁(`cordis.patch.yml`),因此 profile 的 layer 栈会
171
+ 自动拾取 `codearts-auth` 行。插件注入由 dsh base 提供的 `credentials`、
172
+ `commands` 和 `llm` 服务。
173
+
174
+ ---
175
+
176
+ ## 用法
177
+
178
+ **登录入口:Jet Hub 设置页的对应 provider 面板。**
179
+
180
+ ⚠️ **不注册任何斜杠命令** —— 登录、状态查看、续期与积分领取统一在 Jet Hub 完成。
181
+
182
+ 基本流程:
183
+
184
+ 1. 打开 Jet Hub(点主导航里的 **Jet Hub** 一行;也可从「设置 → 插件 → Jet Hub」
185
+ 进入 —— 两条路径渲染的是**同一个页面**);
186
+ 2. 点「**+ 新建账号**」→ 浏览器打开授权页 → 完成登录;
187
+ 3. 需要多个账号时重复第 2 步(账号池会自动选号);
188
+ 4. 回到 dsh 的模型选择器,选中该渠道的模型即可开始对话。
189
+
190
+ ### 「面板入口」:两个入口二选一
191
+
192
+ 上面那两条进入路径是**互斥**的,只能保留一条。改法在**插件详情页**:
193
+ 「设置 → 插件 → dsh-providers-hub」,页面里有一张设置卡,卡里一个「**面板入口**」
194
+ 下拉:
195
+
196
+ | 选项 | 结果 |
197
+ |---|---|
198
+ | **仅侧栏**(默认) | 主导航里多一行「Jet Hub」;设置弹层里**没有** Jet Hub 那一节 |
199
+ | **仅设置页** | 只剩「设置 → 插件 → Jet Hub」;主导航那一行消失 |
200
+
201
+ ⚠️ 默认是「仅侧栏」,所以**设置弹层里默认找不到 Jet Hub 一节**,这不是插件没装好。
202
+ 想从设置里进,就把下拉切成「仅设置页」——切换后主导航那一行会消失。
203
+
204
+ 偏好存在宿主侧而不是浏览器存储,重启后保持 —— 理由见 `docs/agent-notes/client-ui.md`。
205
+
206
+ 「+ 新建账号」是**两步式**的:先返回 `loginUrl` 由前端弹窗打开,后台再轮询换取
207
+ 令牌 —— 这样不会阻塞浏览器手势窗口,弹窗不会被拦截。
208
+
209
+ 账号卡片支持:**测试 / 重测 / 重置 / 停用 / 代理 / 指纹 / 删除**,以及拖拽排序
210
+ (**顺序即选号优先级**)。停用只影响自动选号,**不影响凭据续期与积分领取**。
211
+
212
+ ⚠️ 「**代理**」按钮目前只对 `opencode` 与 `gemini` 渲染(两者语义不同,见
213
+ 「出不去墙外服务」一节);其余渠道的账号卡片上没有这个按钮。
214
+
215
+ ---
216
+
217
+ ## 支持的渠道
218
+
219
+ 17 个 provider 路由,互不覆盖,可同时使用。
220
+
221
+ | id | 渠道 | 登录方式 | 积分能力 |
222
+ |---|---|---|---|
223
+ | `codearts` | CodeArts(华为云) | 浏览器回调 | 余额 + 每日签到 |
224
+ | `buddy` | CodeBuddy(腾讯) | 浏览器授权 + 轮询 | 余额 + 每日签到 + 成长任务 + 锁定永久积分 |
225
+ | `workbuddy` | WorkBuddy(国际版) | 同上 | 余额 + 锁定永久积分(**无签到**) |
226
+ | `lobsterai` | LobsterAI(有道) | 浏览器回调 | 余额 + 每日签到 |
227
+ | `qoder` | Qoder(阿里系) | 设备码轮询 | 余额 + 每日领取 |
228
+ | `qodercn` | Qoder 中国版 | 同上(共用实现) | 余额 + 每日领取 |
229
+ | `trae` | TRAE(字节跳动) | 浏览器回调 | 余额 + 签到 |
230
+ | `cline` | Cline | WorkOS 设备码轮询 | 余额 |
231
+ | `loomy` | Loomy(讯飞) | 短信验证码 | 余额(两个池)+ 每日额度 + 新手任务 |
232
+ | `raccoon` | Raccoon Work(商汤) | 微信扫码 / 短信 | 余额 + 一次性登录奖励 |
233
+ | `minimax` | MiniMax Code (中国版) | OAuth 设备码 + PKCE | 余额 + 每日签到 |
234
+ | `minimaxintl` | MiniMax Code (国际版) | 同上(共用实现) | 余额 + 每日签到 |
235
+ | `zcode` | ZCode(智谱 z.ai) | OAuth 设备码 | 余额 + 每日领取(含**营销活动**投放,如 1024 程序员节 5 亿 token) |
236
+ | `opencode` | OpenCode | — | 余额 |
237
+ | `gemini` | Gemini Code Assist | 浏览器回调 | 余额 |
238
+ | `officeace` | OfficeAce(华为 MaaS / 果办) | 华为云 OAuth PKCE | 余额 + 自动领取(**无手动签到入口**) |
239
+ | `accio` | Accio(阿里) | 浏览器回调 | 余额(三类桶;**无签到**) |
240
+
241
+ 各渠道的能力与限制要点:
242
+
243
+ - **图片输入**:`buddy` / `workbuddy` / `trae`(逐模型)/ `minimax` / `minimaxintl`(部分模型)/
244
+ `accio`(逐模型)支持;`lobsterai`、`zcode` **不支持**;其余以模型声明为准。
245
+ ⚠️ `accio` 的图片通路**已于 2026-10-14 实测接通**(issue IKLR7V,上游原生收图
246
+ `parts[].inline_data`,四色全对);但它的 `multimodal: false` 模型**不报错、而是静默
247
+ 忽略图片**(会把答案**幻觉**出来),插件因此按**逐模型**声明模态(`false` 写 `['text']`),
248
+ 把这类模型挡在选择器之外。
249
+ - **思考档位**:多数渠道支持,档位名按各渠道自己的定义下发;未声明的渠道不发送该字段。
250
+ - **`loomy`** 是唯一用**短信验证码**登录、且**不能自动续期**的渠道。
251
+ - **`zcode`** 的领取路径需要一次性验证参数,由本机浏览器环境产出(web 版需要
252
+ chromium,桌面版用自带内核)。
253
+ ⚠ **推理(对话)路径是否也要它,由服务端开关决定**:官方 3.14.5 起
254
+ `GET /api/v1/client/configs` 会下发 `captcha.skip_model_request`
255
+ —— 当前实测是 `true`(**不校验**,故按最省的方式「先探后取」:
256
+ 不带验证头先发一发,被 `3007` 拒了才产);一旦服务端翻成 `false`,
257
+ 插件会**自动改为首发直接带上**,不再白吃那发注定失败的往返
258
+ (判据是三态:缺席 = 不知道 = 保持先探,见 `requiresCaptchaUpfront`)。
259
+ ⚠️ **找不到浏览器时用 `ZCODE_CHROME_PATH` 指定**(Gitee issue IKQ4JN):
260
+ 这是该链路**唯一**的人工出口,值是 chromium 内核浏览器的**绝对路径**
261
+ (如 `C:\Program Files\Google\Chrome\Application\chrome.exe`)。
262
+ 候选链按优先级为 `ZCODE_CHROME_PATH` → `SCOOP` / `SCOOP_GLOBAL` →
263
+ **从 `PATH` 反推的 scoop 根** → `~/scoop` → 系统 Chrome / Chromium /
264
+ **Brave** / Edge。
265
+ ⚠️ **设完必须重启 `dsh web`,且新进程要继承新环境** —— 从**旧终端**重启时
266
+ 新进程继承的仍是旧 shell 的环境快照,变量实际为空。找不到浏览器时的报错
267
+ 会回显「本进程看到的 `ZCODE_CHROME_PATH` = …」与**逐条候选路径**,
268
+ 照着它能立刻分清「变量没生效」与「路径写错」。
269
+ ⚠️ **scoop 装在非默认根时不必设变量**:从 `PATH` 的 `<root>\shims` 反推
270
+ 已覆盖(用 `root_path` 把 scoop 挪到 D 盘的机器上 `SCOOP` 是空的,
271
+ 旧版因此一个 chromium 都找不到)。
272
+ ⚠️ **不支持两类「看着能用」的封装**:Chrome++ 之类**外层 exe 启动后自行退出**
273
+ (CDP 端口会正常起来,但退出码 0 被判为异常退出);以及
274
+ `chrome-headless-shell`(headless 一律 `F001`,必须 headful)。
275
+ - **`zcode` 的领取有「两个来源」,签到会同时查、一起去领**(2026-10-23):
276
+ ① 每日赠送 —— `GET /api/v1/zcode-plan/billing/preview` 的 `plans`;
277
+ ② **营销活动投放** —— `GET /api/v1/marketing/touch` 里横幅按钮的
278
+ `claim_zcode_plan`。后者就是官方客户端那类「限时可领取」横幅(如
279
+ **1024 程序员节 5 亿 token**),它**不在** `preview` 里 —— 只查 preview 时
280
+ 它与「今天没有活动」在报文上**完全同形**(都是 `plans: []`)。
281
+ ⚠️ **营销端点与领取端点都按客户端版本门控**:插件凭据里记的是自己的版本号
282
+ (如 `3.14.3`);用它查投放会拿到**空投放**,用它**领取**则回
283
+ `400 / code 1004 no permission`(官方文案:「当前账号或**客户端版本**不满足
284
+ 领取条件」—— 极易被误读成「这个账号没资格」)。两条请求都会**按需抬到
285
+ `3.16.3`**(`ZCODE_VERSION_GATED_MIN_APP_VERSION`;实测同一账号、其余头完全相同,
286
+ 只改这一个字段:查投放 `3.14.3` → `deliveries: []` / `3.16.3` → 有投放;
287
+ 领取 `3.14.3` → `1004` / `3.16.2` → `code 0`)。该覆盖**只作用于这两条请求**,
288
+ 不影响推理与额度两条已实测路径。
289
+ ✅ **真机验收**(2026-10-23,走插件自己的生产路径):`{"kind":"claimed",
290
+ "credit":500000000,"unit":"token"}` —— 5 亿 token 领取成功。
291
+ ⚠️ **「领取成功但额度仍是 0」是正常的**:活动的 `effective_at` 是 **23:00**
292
+ (UTC+8),而额度桶要等那个时刻才建(上游 `plans[].status:"active"` 里
293
+ 额度已锁定,`balances` 仍是空的)。插件会把它单独显示成一个
294
+ 「**待生效**」的包并带出生效时刻,**不并进当前可用额度** ——
295
+ 并进去会让折算层在生效前就把 zcode 派发出去(必然失败)。
296
+ ⚠️ **国际版(`zai`)账号同样能领到**(2026-10-23 实测:4 个账号含 2 个
297
+ 国际版都拿到同一个 1024 计划)⇒ 服务端**不按 OAuth 渠道区分**;
298
+ 「只有中国版有」是官方客户端**奖励中心分站**(`/cn/rewards` vs `/en/rewards`)
299
+ 造成的**入口**差异,插件不做渠道特判。
300
+ ⚠️ 领取成功后插件会回报一次 `POST /marketing/touch/action`(`confirm`),
301
+ 否则服务端会**反复投放同一个活动** ⇒ 每轮签到白烧一个验证参数
302
+ (阿里云验证是**设备级**配额)。失败时**绝不**回报 —— 那会让用户白丢一次机会。
303
+ - **`qoder` / `qodercn`** 共用同一套实现,差异仅在产品配置。
304
+ - **`minimax` / `minimaxintl`** 共用同一套实现(**唯一**的 Anthropic Messages
305
+ 协议族渠道),差异仅在产品配置。⚠️ 两站的**账号不互通、API 主机也不同**,
306
+ 故它们是**两个独立面板** —— 各自在自己的面板里点「+ 新建账号」即可,
307
+ **无需选择站点**(`minimax` → `agent.minimax.cn`,`minimaxintl` → `agent.minimax.io`)。
308
+ ✅ **国际版已完成真机验证**(2026-10-15):登录、账号管理、模型目录、**推理**、
309
+ **每日签到**、**积分查询**全部实测可用 —— 与国内站**协议同形**(认证同样只需
310
+ `Authorization: Bearer`)。核验入口见 `tests/e2e/README.md` 的
311
+ `test:e2e:minimaxintl`。
312
+ ⚠️ 国际站的**目录端点当前是公开的**(无 token、垃圾 token 都 200)⇒
313
+ 「能看到模型列表」**不代表**凭据有效(凭据证据看签到 / 积分 / 推理)。
314
+ ⚠️ 若国际站各端点**同时**报 `token is required` / `invalid signature`,
315
+ 请先怀疑**上游故障**而不是配置 —— 此时**官方 mcode 客户端也会同样失败**。
316
+ - **`gemini`(必须过墙,见「出不去墙外服务」一节)**:Google 的登录与接口全部
317
+ 在墙外。⚠️ 症状极具误导性:**浏览器能打开授权页并点「同意」,面板里账号却一直
318
+ 不出现** —— 因为**浏览器读系统代理、插件进程不读**。这不是 `client_secret` 或
319
+ `redirect_uri` 配错(那个 bug 已被修掉,token 端点强制校验客户端身份)。
320
+ - **`accio`** 登录走浏览器回调。⚠️ **新建账号时必须先选登录区域**(中国版 `www.accio-ai.com` / 国际版 `zh.accio.com`):两个区域的**登录页域名不同**,
321
+ 而区域由服务端按账号下发、**登录前无法自动判断** ⇒ 选错会打开打不开的登录页,
322
+ **登录不会成功**。区域会写进凭据,续期与推理按它选域名。
323
+ ⚠️ **它没有签到按钮** —— 每日积分由服务端在**登录时**发放(24 小时有效、
324
+ **不累积**,未登录的那天不补),没有可调用的领取接口。面板上的积分按服务端下发的
325
+ **三类桶**(每日 / 每月 / 推荐)分列显示,并给出每日额度的重置倒计时。
326
+ ⚠️ **「刷新每日额度」入口尚未实现**:它本质是**重新登录既有账号**,
327
+ 需要宿主侧新增一条 RPC(现有的「+ 新建账号」每次都会新造账号,拿它重登只会
328
+ 多出一个空账号而原账号额度不变)。**当前要刷新请删除该账号后重新登录一次。**
329
+ ⚠️ 模型**倍率跨度极大**(0.013 ~ 2.8,**215 倍**),故倍率直接写进模型展示名
330
+ (`模型名 · x倍率`),选型时看名字即可。
331
+ ⚠️ **图片输入未实测**,面板会明确报「暂不支持图片输入」而不是静默丢掉。
332
+ ⚠️ **该渠道不产生限流标记**(也不会被限流探针测出东西),故「重测 / 重置」这组
333
+ 按钮对它**整组不渲染** —— 渲染出来只会是点不动的死控件。
334
+
335
+ ### 一键领取积分
336
+
337
+ 在对应面板标题栏点「**一键领取积分**」,插件会**顺序**处理该面板下的所有账号
338
+ (顺序执行以避免并发请求),并**逐账号显示结果与原因**。
339
+
340
+ ⚠️ 汇总**按单位分列**,不跨量纲求和 —— `ZCode` 的额度单位是 **token**、其余渠道是
341
+ **积分**,两者不可折算,因此显示成 `+100.00MToken, +100积分` 而不是加成一个数。
342
+
343
+ ### 模型列表开关
344
+
345
+ 每个 provider 的面板都有「**显示列表**」按钮,可逐个开关模型,控制它是否出现在
346
+ 对话框的模型选择器里(**黑名单制**,默认全部显示)。开关按 provider 隔离。
347
+
348
+ ### 锁定永久积分
349
+
350
+ `buddy` / `workbuddy` / `loomy` 提供「**锁定永久积分**」按钮,用来保住不会马上
351
+ 作废的积分。判定规则:距扣费截止不足 15 天的算**临时**(优先消耗),其余算永久。
352
+ 锁定后只消耗临时积分,用完则明确报错而不是偷偷烧掉永久积分。
353
+
354
+ ### 出不去墙外服务(`gemini`,以及任何需要代理的环境)
355
+
356
+ `gemini` 是本插件里**必须过墙**的渠道:令牌端点(`oauth2.googleapis.com/token`)、
357
+ userinfo、Cloud Code 的配额与推理端点(`cloudcode-pa.googleapis.com`)全部在墙外。
358
+
359
+ **典型症状**:浏览器**能**打开授权页并点「同意」,回到面板却一直失败、账号列表里
360
+ 始终没有这个号;或账号在、但积分与对话全部失败。
361
+
362
+ **为什么浏览器能用、插件不能用**:浏览器读 **Windows 系统代理(WinINET)**,
363
+ 而插件跑在 Node 的 `fetch`(undici)上,它**既不读系统代理、也不读
364
+ `HTTP(S)_PROXY`**。这条差异是全部症状的根源。
365
+
366
+ #### 两种配法(任选其一)
367
+
368
+ **① 给单个账号配出口代理(推荐)**
369
+
370
+ 在 Gemini 面板的账号卡片上点「**代理**」→ 填地址(`http://127.0.0.1:7897` /
371
+ `socks5://…` / 带认证的 `http://user:pass@host:port`)→「测试连接」→ 保存。
372
+
373
+ - 「测试连接」**打的是 Google 自己的端点**(不是通用的出口 IP 查询服务):
374
+ 代理能通 `ip-api` 却被 Google 拒的情况很常见,用后者会产生**假阳性**。
375
+ - 配好后该账号的**登录、续期、积分、对话**全部走这条出口,且**每个账号可以
376
+ 配不同的代理**。
377
+ - ⚠️ 该配置只作用于 Gemini(与 `opencode` 的「代理」是**两份独立配置**,
378
+ 清掉互不影响)。
379
+
380
+ **② 启动 dsh 之前导出环境变量**
381
+
382
+ ```powershell
383
+ # PowerShell
384
+ $env:HTTPS_PROXY = 'http://127.0.0.1:7897'
385
+ $env:HTTP_PROXY = 'http://127.0.0.1:7897'
386
+ $env:NO_PROXY = 'localhost,127.0.0.1,::1'
387
+ dsh
388
+ ```
389
+
390
+ ⚠️ **必须「导出为环境变量」**。只打开系统代理开关(Windows 设置里的「使用代理
391
+ 服务器」)**无效** —— 那正是浏览器能用、插件不能用的原因。
392
+
393
+ 宿主 dsh 会在**第一个插件加载前**装一个全局代理分发器,所以这种配法对**插件的全部
394
+ 请求**生效(不只 Gemini),也**不需要**额外设置 `NODE_USE_ENV_PROXY`。
395
+
396
+ #### Node 版本差异(2026-10-18 本机实测)
397
+
398
+ 若走 ①(账号代理)不受此表影响 —— 它走插件自己的分发器,与 Node 版本无关。
399
+ 下表说的是「裸 `fetch` 读环境变量」那条路:
400
+
401
+ | Node | 仅设 `HTTPS_PROXY` | 再加 `NODE_USE_ENV_PROXY=1` |
402
+ |---|---|---|
403
+ | 22.19 | ❌ 不读 | ❌ 不读 |
404
+ | 24.21 | ❌ 不读 | ⚠️ 读,但失败后会反复重试,界面长时间无响应 |
405
+ | 26.10 | ❌ 不读 | ✅ 可用 |
406
+
407
+ ⇒ **结论**:这条「绕过」的路只在较新的 Node 上干净。优先用 ①。
408
+
409
+ #### 报错文案
410
+
411
+ 连不上时,插件会明确提示「疑似需要代理」并带上根因码(如
412
+ `UND_ERR_CONNECT_TIMEOUT`),登录失败、续期失败、积分查询失败与对话失败四条腿
413
+ 都会给同一句指路文案 —— 不再是一句无信息量的 `fetch failed`。
414
+
415
+ ⚠️ 代理恢复后**无需重登**:凭据没被标成失效,后台续期会照常在下一轮把它接上。
416
+
417
+ ---
418
+
419
+ ## 聚合路由(`aggregate`)
420
+
421
+ 同一个真实模型往往在**多个渠道**都能用(例如 DeepSeek V4.1 Flash 在 buddy、
422
+ codearts、cline 等都有)。聚合路由把「同一个真实模型」在各渠道的条目**归到一个
423
+ 规范名下**,请求时自动挑一个渠道发出去。
424
+
425
+ **解决什么**:各家渠道送的免费额度**有到期时间**,用不完就作废。聚合层按
426
+ 「**最快作废的额度优先用**」自动排序,把临期积分先烧掉。
427
+
428
+ **怎么用**:
429
+
430
+ 1. 在模型选择器里选 **`aggregate`** 分组;
431
+ 2. 想**不挑模型**就选该分组下的 **`auto`** —— 它用**所有参与轮换的渠道**的全部模型当
432
+ 候选池(哪些渠道参与见下面「参与轮换的渠道」);
433
+ 3. 想**指定模型**就选该分组下的**具体规范名**(如 `Deepseek-V4.1-Flash`)。
434
+
435
+ 选中后模型名旁会附一个 **`· <渠道>`** 后缀,那是**首选渠道**(临期最早的那个)。
436
+ ⚠️ 它**不是「本次实际发往的渠道」** —— 真实历史由**用量徽标**显示。
437
+
438
+ **自动切换**:某个渠道失败时会换下一个候选重试,但只在**还没吐出任何可见内容**
439
+ 时才切换(已输出的内容收不回来,拼接会产生畸形回答)。
440
+
441
+ **参与轮换的渠道**:`buddy` / `workbuddy` / `loomy` / `codearts` / `zcode` /
442
+ `lobsterai` / `trae` / `accio` / `officeace` 九家。其余渠道**暂不参与**(插件对
443
+ 它们的额度到期时刻没有可靠信息,宁可少一个候选,不可把未知当可用)—— 它们仍可
444
+ **直连**正常使用。
445
+
446
+ ⚠️ **真正决定「某渠道在不在轮换里」的是一张编译期清单**
447
+ (`src/aggregate-expiry.ts` 的 `WIRED_EXPIRY_PROVIDERS`),**不是**
448
+ `src/aggregate-adapter.ts` 的 `AGGREGATE_CHANNELS`。上面这份名单就是按前者列的。
449
+ 只加 `AGGREGATE_CHANNELS` 是**无效接线**,且症状**完全静默**(零报错、零日志)。
450
+ 后果分两种,别只记住第一种:
451
+
452
+ | 该渠道的模型 | 会发生什么 |
453
+ |---|---|
454
+ | 与已接入渠道**共用规范名** | 它的候选**出现在聚合面板里**,但**默认不参与轮换**(标着「无临期积分 · 未参与」)⇒ 需要你**逐条手工打开** |
455
+ | 是**独有**模型 | 虚拟模型**也在目录里**(可被选中),同样默认不参与轮换、可逐条手工打开 |
456
+
457
+ ⚠️ 上面第二行是 **2026-10-15 的行为变更**:升级前这类模型会被过滤掉、**连聚合目录都进不去**,
458
+ 于是「手工打开候选」之后你在模型选择器里**仍然看不到它**(打开白做)。
459
+ 现在改为**目录身份与你的开关无关**:模型始终在目录里,参不参与由每条候选自己的状态决定。
460
+ 若你选了一个「没有任何候选在轮换」的模型,报错会**如实**告诉你这一点(并给出面板路径),
461
+ 而不是把它藏起来。
462
+
463
+ (真正拦下**轮换候选**的是 `src/aggregate-expiry.ts` 里那句「未接入 ⇒ `UNUSABLE`」
464
+ 短路,**不是**适配器自己那几处过滤 —— 后者管的是面板与元数据面。)
465
+
466
+ ### 没有临期信息的渠道:默认不参与,可逐条打开
467
+
468
+ 对那 7 家**没有可靠到期时刻**的渠道(`qoder` / `qodercn` / `cline` / `raccoon` /
469
+ `minimax` / `gemini` / `opencode`),2026-10-15 起你可以在聚合面板里**逐条手工打开**
470
+ 它们的候选,打开后它们**真的参与轮换**(排在所有能算出临期的候选**之后** ——
471
+ 它们之间没有可比较的到期时间,那种混合顺序是**正常**的,不是缺陷)。
472
+
473
+ - **默认态是「不参与」**:插件对它们的配额一无所知,默认放行会把失败留给你;
474
+ - 顶部有 **「拒绝非临期」** 一键按钮,把所有没有临期折算的渠道**恢复成默认不参与**
475
+ (已接入的九家**不受影响** —— 它们的手工打开是有意义的);
476
+ - ⚠️ **没有「一键全部放行」**:配额未知的渠道被批量放行会把失败留给你,
477
+ 故只提供逐条打开 + 一键恢复默认这一对操作。
478
+
479
+ ⚠️ 同一个账号的额度到期信息**不会因为手工打开而变得可知** —— 打开只是允许插件去**尝试**它。
480
+
481
+ ### 候选顺序:按临期排序 / 按手工排序
482
+
483
+ 面板顶部有一个两段式开关:
484
+
485
+ | 模式 | 意思 | 会自动刷新吗 |
486
+ |---|---|---|
487
+ | **排序:按临期** | 按「积分最快作废」的顺序(默认) | ✅ 面板打开期间**每 2 分钟**自动重查一次;该模式也是探测按钮,点它立即重查 |
488
+ | **排序:按手工** | 按你拖出来的顺序 | ❌ 不自动重查(顺序由你决定) |
489
+
490
+ - 两种顺序**分别保存**:切到手工拖好、再切回临期,切回手工时你排的顺序**还在**;
491
+ - 手工模式下可**拖动**候选调整顺序(鼠标拖动手柄,**松手即保存** —— 不需要再点按钮);
492
+ - 手工序是**严格序**:你拖过的候选排在**全部**没拖过的之前,**即使它临期更晚** ——
493
+ 否则你的拖动会被临期值静默覆盖;
494
+ - 没拖过的候选按「临期 ↑ → 倍率 ↑」追加在**后面**(新增的候选因此不会消失)。
495
+
496
+ ⚠️ **「按临期」不是后台常驻定时刷新**:它只在**面板打开且处于该模式**时每 2 分钟查一次
497
+ (且标签页在后台时跳过)。关掉面板就不再查询 —— 插件没有为「排序展示」常驻的定时器。
498
+ 若你在渠道侧改了配置想立刻看到,点一次「排序:按临期」即可。
499
+
500
+ 同类陷阱已**多次**发生(`cline` 只进过 `AGGREGATE_CHANNELS`、**从未**进过白名单;
501
+ `accio`、`officeace` 是先进行、后补白名单)。接新渠道时**两处必须同改**,
502
+ 另有第三处 `src/provider-expiry.ts` 的 `createProviderExpiry()` 一并跟进 ——
503
+ 后两者的运行期一致性由 `tests/unit/expiry-runtime-parity.spec.ts` 锁住。
504
+
505
+ ⚠️ **`zcode` 的额度是「按模型」分桶的**,故它的可用性是**逐模型**判定的:
506
+ 赠送的 8M 实测分成 `GLM-5.3` 3M 与 `GLM-5.3-Flash` 5M 两个**专属桶**
507
+ (上游在余额接口里下发 `capabilities: ["model:<模型>"]`)。某个模型烧光而另一个
508
+ 还有额度时,只会把**烧光的那个模型**在该账号上标记为当日用尽 ——
509
+ 另一个模型照常可用,不会因为「账号整体还有额度」而误派发到已尽的模型上。
510
+ 若账号另有**不限定模型**的通用赠送额度(如 1 亿 token),且它还有余额,
511
+ 则两个模型都仍可用(通用额度能承接它们)。
512
+
513
+ **上下文窗口**:聚合模型声明的是**候选渠道里的最大值**。同一个模型在 buddy /
514
+ codearts 上都是 1M,那么 `aggregate` 下选它也声明 1M(与直连一致)。⚠️ 若某次
515
+ 请求恰好被路由到窗口更小的候选,由**失败切换**兜住(上游报超长 ⇒ 换下一个候选)。
516
+
517
+ **思考档位**:声明各渠道档位的**并集**(官方中文名),默认 `high` —— 与你选的
518
+ 档位会**逐候选翻译**到目标渠道(精确命中就原样下发,写法不同就就近落到同族,
519
+ 目标没有这一族就**不下发**该字段让它走自己的默认)。
520
+
521
+ 聚合有**自己的**设置面板(Jet Hub 左侧 rail 的「聚合」项),可逐条控制候选
522
+ 「是否参与轮换」(三态:参与 / 已拒绝 / 无临期积分·默认不参与),并提供
523
+ 「排序:按临期 / 按手工」开关与「拒绝非临期」一键恢复。它没有账号与凭据(复用各渠道的账号)。
524
+
525
+ ### ⚠️ 模型选择器里为什么有**两个**「Auto」
526
+
527
+ 选到「不挑模型」这一档时,选择器里会出现**两条**看起来同义的项:
528
+
529
+ | 选择器里显示为 | 真实路由 | 代码 |
530
+ |---|---|---|
531
+ | **`聚合(跨渠道临期优先)`** 组下的 `Auto(聚合 · 跨渠道)` | `aggregate` / `auto` | `src/aggregate-adapter.ts` |
532
+ | **`Jet Hub 自动(临期优先)`** 组下的 `Auto(临期优先 · 整池)` | `jet-hub-auto` / `auto` | `src/auto-adapter.ts` |
533
+
534
+ 后者是**上一代实现**(2026-10-06),前者是随后的重写(2026-10-07,`ba10f4f`)
535
+ 并**泛化**成「规范模型名 + 渠道候选 + auto」三者共用一套排序
536
+ (`aggregate-core.ts`)。⚠️ 旧 auto 的**路由注册从未下线** —— `registerAutoLlm`
537
+ 在 `ba10f4f` 前后都在 `src/index.ts` 里;`ba10f4f` 删掉的是它的**用量徽标接线**
538
+ (`lastDispatch` / `lastExpiryAt` 等字段与 `usage.badge` 改写),由 `2b8867c`
539
+ (2026-10-08「恢复旧 auto 的用量徽标」)补回,**两代因此并存至今**。
540
+ `src/index.ts` 的接线注释里直接称它为「**旧 auto**」。
541
+
542
+ ⚠️ **日常请优先用 `聚合(跨渠道临期优先)`** —— 它是活跃维护线,两者**至少有四处**实质差异:
543
+
544
+ | | `aggregate/auto` | `jet-hub-auto/auto` |
545
+ |---|---|---|
546
+ | 候选渠道 | **9 家**(`WIRED_EXPIRY_PROVIDERS`) | **5 家**(`AUTO_PROVIDERS` 硬编码:`codearts` / `loomy` / `zcode` / `buddy` / `workbuddy`) |
547
+ | 尊重「拒绝轮换」开关 | ✅ | ❌ 不读拒绝表 |
548
+ | 「收下请求却零输出」目标级冷却 | ❌ 无 | ✅ 有(`zero-output-guard.ts`,issue IKJW31) |
549
+ | **候选级失败切换** | ✅ 某渠道失败时按候选序**换下一个重试** | ❌ **不换**:上游报错即整轮失败(只对「零输出」这一种情形改道) |
550
+
551
+ ⚠️ **模型黑名单关不掉旧 auto**:它的 `listModels()` 无条件返回这一个模型、不套用户黑名单
552
+ (黑名单针对的是各渠道的真实模型),且 `jet-hub-auto` **不在** `provider-registry.ts`
553
+ 里 ⇒ 设置页里连它的面板都没有。**忽略它即可**,选聚合那条。
554
+
555
+ ⚠️⚠️ 但这**不等于「无法隐藏」**:`jet-hub-auto` 的 `ctx.llm` 注册路由**参与「已失效模型
556
+ 剔除」**(`auto-adapter.ts` 注册时没传 `pruning`,而缺省即参与 —— 见
557
+ `llm-register-compat.ts` / `dead-model-store.ts`;对照 `src/index.ts` 对 `aggregate`
558
+ 与对 `jet-hub-auto` 的**设置页表项**都是显式 `{ enabled: false }`)。
559
+ 一旦 `dead-models.json` 里出现 `jet-hub-auto/auto` 记录,它就会从模型选择器消失,
560
+ 而清除入口 `model.clearDead` 位于**它没有的那个面板**里 ⇒ **没有界面能恢复**
561
+ (只能手改 `dead-models.json` 或等 TTL 过期)。
562
+ ⚠️ 生产可达性**未证实**:已知写入口需在该路由迭代中抛出「模型已下架」类错误,
563
+ 而 auto 自身不走那条路径(真实用户盘里也只有一条 `aggregate/m1` 历史记录)。
564
+ ⇒ 机制真实、当下**侥幸**未触发,按「**脆弱的绿**」对待。
565
+
566
+ (`src/aggregate-adapter.ts` 模块头的分工表里,「渠道内选模型 = 按倍率挑最便宜」与
567
+ 「用途 = 不挑模型,谁临期烧谁」两格写的是「同左」;⚠️ 但**「候选来源」那格并不相同**
568
+ —— 旧 auto 是「5 个渠道的所有模型」,聚合是「所有渠道的所有模型」。
569
+ 上表列的是**最要紧**的四处,不是穷举:上下文窗口的声明口径、用量徽标的数据源、
570
+ 候选粒度(聚合按 `(渠道, realId)` 且同渠道内可回落下一个模型,旧 auto 每渠道只挑一个)
571
+ 也都不同。是否合并/下线旧 auto 涉及把 `zero-output-guard.ts` 移植过去,
572
+ **属行为变更**,留待维护者定夺。)
573
+
574
+ ---
575
+
576
+ ## 本机 OpenAI 网关
577
+
578
+ 插件启动后会在 `127.0.0.1:8326` 提供**两套**标准 OpenAI 接口,供 Pi、Continue、
579
+ Cline、OpenCode、Codex 或其他兼容客户端使用。网关复用 Jet Hub 已登录账号和现有
580
+ provider 适配器,不把上游凭据复制到客户端。
581
+
582
+ ```
583
+ GET http://127.0.0.1:8326/v1/models
584
+ GET http://127.0.0.1:8326/v1/reasoning-efforts ← 思考档位对照表
585
+ POST http://127.0.0.1:8326/v1/chat/completions ← OpenAI Chat Completions
586
+ POST http://127.0.0.1:8326/v1/responses ← OpenAI Responses API
587
+ ```
588
+
589
+ ⚠️ **两个端点同时可用,没有「格式开关」**:客户端用哪一套协议,由它自己请求的
590
+ 路径决定。
591
+
592
+ ⚠️ 上面那两个地址里的 **host 与端口都可被环境变量改掉**
593
+ (`DSH_OPENAI_GATEWAY_HOST` / `DSH_OPENAI_GATEWAY_PORT`);设置页里的
594
+ 「API 请求地址」显示的是**实际监听地址**,照它抄即可。
595
+
596
+ ### 容器化部署(Docker / Compose)
597
+
598
+ 默认只绑 `127.0.0.1`,因此**端口映射对网关无效**:容器里 `curl 127.0.0.1:8326`
599
+ 能通只是假象,docker-proxy 与同网络的其它容器走的是容器桥接 IP(`eth0`),
600
+ 那个地址上没有监听,于是宿主侧看到 `Connection reset by peer`
601
+ (对照:Web 端口绑的是容器 IP,所以映射可用)。
602
+
603
+ 修法是让网关绑**容器自身的接口地址**:
604
+
605
+ ```yaml
606
+ environment:
607
+ - DSH_OPENAI_GATEWAY_ENABLED=1
608
+ - DSH_OPENAI_GATEWAY_HOST=172.21.0.8 # 容器自身 IP:hostname -i 或 ip -4 addr show eth0
609
+ - DSH_OPENAI_GATEWAY_PORT=8326
610
+ ```
611
+
612
+ ```console
613
+ $ docker exec dsh ss -tlnp | grep 8326
614
+ LISTEN 172.21.0.8:8326 # 绑上桥接 IP 后,端口映射才可达
615
+ ```
616
+
617
+ ⚠️ **不许填 `0.0.0.0` / `::` 这类通配地址**:会被显式拒绝并在启动前报错
618
+ (dsh 本体的 `--host` 也是同一姿态)。绑通配等于把网关暴露给整个网络,
619
+ 真正的隔离只剩 API Key —— 而本网关承担的是「用你已登录的账号发请求」。
620
+ 容器场景填容器自身 IP 即可。
621
+
622
+ ⚠️ **暴露面不止「同一容器网络内的其它容器」,还包括宿主**:经端口映射(`-p`)
623
+ 或 bridge 网关,宿主本身就能连到该端口。跨 bridge 网络的容器才被隔离。
624
+ 设置页里绑了非回环地址时会显示这条提示;不打算对外提供时请保持默认
625
+ `127.0.0.1`(或删除该环境变量)。
626
+
627
+ ### 拿到地址与密钥
628
+
629
+ 鉴权使用 `Authorization: Bearer <网关 API Key>`。
630
+
631
+ ⚠️ 因此**在浏览器地址栏直接打开这些地址会返回 401**(没有带 Bearer 头)——
632
+ 这是预期行为,不是网关没启动。请用客户端或 `curl` 带上传头访问。
633
+
634
+ 优先从 `DSH_OPENAI_GATEWAY_API_KEY` 读取;未设置时,插件首次启动会在 DSH home 的
635
+ `openai-gateway/api-key` 生成并持久化随机密钥,重启后保持不变。
636
+
637
+ 设置页里的开关状态存在 `$DSH_HOME/jet-hub/state.json` 的 `gatewayEnabled` 字段
638
+ (缺省为启用)。它**不进**账号备份/恢复。
639
+
640
+ ### 关闭网关
641
+
642
+ 网关是**旁路功能**:它启动失败或被关闭,都不影响插件其余功能(登录、积分、模型
643
+ 目录照常)。三种关闭方式:
644
+
645
+ | 方式 | 做法 |
646
+ |---|---|
647
+ | 环境变量 | `DSH_OPENAI_GATEWAY_ENABLED=0`(**完全不启动**,连 API Key 文件都不生成)|
648
+ | 设置页开关 | 关掉后不再监听 |
649
+ | 改端口 | `DSH_OPENAI_GATEWAY_PORT` 填非法值会记录错误并跳过启动,**不会**静默改用其它端口 |
650
+ | 改地址 | `DSH_OPENAI_GATEWAY_HOST` 填通配地址(`0.0.0.0` / `::`)同样记录错误并跳过启动 —— **不会**静默绑到全部网卡 |
651
+
652
+ ### 请求体上限与 keep-alive
653
+
654
+ | 项 | 值 | 超限时的行为 |
655
+ |---|---|---|
656
+ | 请求体 | **300 MiB** | `HTTP 413` + `invalid_request_error` / `request_too_large`,响应体里带上限值 |
657
+ | 空闲连接(keep-alive) | **120 秒** | 服务端发 FIN;此后复用该连接会得到 `Connection reset` |
658
+
659
+ ⚠️ 每轮把全量历史重新回传的客户端(Codex 等),历史里并入大截图后可能撞上 413:
660
+ 新建会话、或删掉那条带大图的回合即可恢复。
661
+
662
+ ### 安全边界
663
+
664
+ - **默认**只绑定 `127.0.0.1`,且**拒绝**通配地址(`0.0.0.0` / `::`)。
665
+ 只有容器/端口映射这类「客户端不在同一网络命名空间」的场景才需要改
666
+ `DSH_OPENAI_GATEWAY_HOST`,且应填**具体接口地址**(如容器自身 IP)而不是通配。
667
+ ⚠️ 改了之后暴露面**包含宿主**(端口映射/bridge 网关都能连到),
668
+ 同机与同容器网络的其它用户或进程也能连到该端口 —— 真正的隔离靠 API Key,
669
+ 不要把它配置进任何浏览器端工具或扩展。
670
+ - 密钥以明文写在 `$DSH_HOME/openai-gateway/api-key`。POSIX 下的 `0600` 权限在
671
+ **Windows 上不生效**,多用户机器请改用 `DSH_OPENAI_GATEWAY_API_KEY` 环境变量。
672
+
673
+ ---
674
+
675
+ ## 用量徽标与 Token 用量
676
+
677
+ ### 用量徽标
678
+
679
+ 会话输入区右侧、模型选择器左边有一枚薄胶囊,显示**当前渠道一共有多少可用额度**;
680
+ 点开是完整浮层(逐账号明细 / 订阅窗口 / 刷新 / 签到 / 显示偏好)。
681
+ 只在选中本插件渠道的模型时渲染,非本插件的模型**不渲染、不发请求**。
682
+
683
+ 折叠态按 **`渠道 • 读数`** 两段显示,例如:
684
+
685
+ ```
686
+ CodeBuddy (腾讯) • 2434.96积分
687
+ CodeArts (华为云) • 9499.84积分
688
+ ZCode (智谱) • 94.54MToken
689
+ ```
690
+
691
+ - **默认显示余额**(一共能用的额度);可在浮层里切换成「优先订阅」或「只看积分」。
692
+ - **多账号只显示一个数字**(所有启用账号的余额合计),不会变成一长串。
693
+ - 账号读不到时合计会**静默少报**,故胶囊会挂一个**警示角标**(`441.78积分 ⚠`)。
694
+ - 浮层里逐账号列表**按余额降序**,超过 5 个折叠成「展开其余 N 个」。
695
+
696
+ ### Token 用量
697
+
698
+ 点 Jet Hub 页头的「**Token 用量**」按钮查看。数据分两份:
699
+
700
+ | 数据 | 位置 | 回答的问题 | 重启后 |
701
+ |---|---|---|---|
702
+ | 实时明细 + 汇总树 | 进程内存(上限 500 条) | 每一笔长什么样、这次会话花了多少 | 清空 |
703
+ | 历史日聚合 | `~/.dsh/jet-hub/token-ledger.json` | 本周 / 本月用了多少 | **保留**(按 UTC+8 日界,90 天)|
704
+
705
+ 在历史图表中点选某一天并展开,可删除该日的历史累计。删除前会二次确认,只移除该日聚合,不影响实时明细、其他日期或账号设置;之后该日的新请求会重新累计。
706
+
707
+ - **计数是 wire 口径**:上游 usage 报什么记什么,不做本地估算。
708
+ - **总处理量** = 未命中缓存输入 + 缓存命中输入 + 输出;输出已含思考 token,缓存写入另列且不重复计入。不同渠道价格不同,因此这里不把 token 数冒充账单金额。
709
+ - 没收到 usage(失败 / 中断)显示 `—`,与真实的 `0` **严格区分**。
710
+ - 输出速率(tok/s)的分子含思考 token;汇总显示算术均值及完整样本的 P50/P90 估值。
711
+ - 日聚合文件升级到 schema v2 增加 TPS 对数直方图;旧 v1 数据照常读取(计数全保留)。⚠️ **升级前已累计过「输出速率样本」的日期不会显示 P50/P90** —— 判据要求「直方图样本数 = 累计样本数」,而旧桶的 `tpsCount` 在升级前就已累加、直方图为空,两者之差恒定 ⇒ 该日期在 90 天保留期内一直无分位数(`avgTps` 均值仍照常显示)。完全在 v2 之后累计满样本的日期正常显示;升级前存在但**从未有过速率样本**的日期(如当天全是失败请求)也会正常显示。
712
+
713
+ ---
714
+
715
+ ## 配置项
716
+
717
+ | 项 | 位置 | 说明 |
718
+ |---|---|---|
719
+ | 账号池 | `$DSH_HOME/jet-hub/state.json` | 账号、有效期、限流标记、模型黑名单、provider 顺序 |
720
+ | 网关开关 | 同上,`gatewayEnabled` | 缺省启用 |
721
+ | 供应商显示顺序 | 同上,`providerOrder` | 纯展示偏好,拖动行调整 |
722
+ | 永久积分锁定 | `$DSH_HOME/jet-hub/*.json`(独立文档)| **不与账号池同放** —— 避免多 profile 互相覆盖 |
723
+ | Token 账本 | `~/.dsh/jet-hub/token-ledger.json` | 历史日聚合 |
724
+
725
+ ### 常见环境变量
726
+
727
+ | 变量 | 默认 | 说明 |
728
+ |---|---|---|
729
+ | `DSH_HIDE_MODELS_WITHOUT_ACCOUNT` | 关闭 | 设为真值时,**没有已登录账号的渠道**在模型选择器里整体隐藏 |
730
+ | `DSH_OPENAI_GATEWAY_ENABLED` | `1` | 设为 `0` / `false` / `off` / `no` 时完全不启动网关 |
731
+ | `DSH_OPENAI_GATEWAY_HOST` | `127.0.0.1` | 网关监听地址。容器/端口映射场景填**容器自身 IP**(`hostname -i`);填 `0.0.0.0` / `::` 等通配地址会被拒绝并跳过启动 |
732
+ | `DSH_OPENAI_GATEWAY_PORT` | `8326` | 网关监听端口 |
733
+ | `DSH_OPENAI_GATEWAY_API_KEY` | 自动生成 | 网关 Bearer 密钥 |
734
+ | `DSH_REASONING_LOOP_GUARD` | 开启 | 思考死循环守卫总开关 |
735
+ | `DSH_REASONING_LOOP_AUTO_RESUME` | 开启 | 中止后是否自动补一句「继续」并重跑 |
736
+ | `DSH_REASONING_LOOP_AUTO_RESUME_MAX` | `2` | 连续自动续跑上限(最大 `10`)|| `DSH_TRAE_CHANNELS` | `solo_work_lite,solo_agent_remote` | TRAE 要拉取的通道,**顺序即优先级** |
737
+ | `DSH_TRAE_MAX_COMPLETION_TOKENS` | `64000` | TRAE 单次输出上限(设 `0` 关闭收敛)|
738
+
739
+ 更多 provider 专属变量(如 `DSH_ZCODE_INTERNAL_CARRIER`、
740
+ `DSH_TRAE_ROTATE_MACHINE_ID` 等)见内部文档。
741
+
742
+ ---
743
+
744
+ ## 账号备份与迁移
745
+
746
+ Jet Hub 设置页底部的**备份**区提供导出 / 导入,用于两种情况:**换 DSH 版本时整体迁移**,
747
+ 以及**从别处单独搬一个账号进来**。
748
+
749
+ 备份文件是**自包含**的 JSON(账号索引 + 凭据原文 + 模型黑名单 + 永久积分锁定表),
750
+ 与 DSH 版本无关 —— 导入时按**当前版本**的存储契约重建,因此天然跨版本。
751
+
752
+ - **加密在浏览器侧完成**(PBKDF2 + AES-GCM),RPC 只收发明文载荷,明文与口令
753
+ 都不经过宿主持久化与日志。可选加密,不勾选即导出明文。
754
+ - 账号凭据、`refresh_token` 都在文件里,**等同于明文密钥**,请自行妥善保管。
755
+ - ⚠️ **不含的就是本机偏好**:备份只搬账号与凭据,**不搬**本机 OpenAI 网关开关、
756
+ 用量徽标偏好、自动签到记账等本机状态(导入时它们保持当前值,不会被备份覆盖)。
757
+ 账号条目上的字段(含 OpenCode 的 `opencodeProxy` / 指纹代次,以及 Gemini 的
758
+ `geminiProxy`)则原样随快照往返。
759
+
760
+ ### 导出:可以只导出选中的账号
761
+
762
+ 导出弹窗列出当前账号池并可**逐个勾选**(`backup.export` 的 `accountIds`),
763
+ 默认「全部账号」。只导一个账号时文件名会带上该账号 id(`dsh-codearts-backup-buddy-xxxx-日期.json`),
764
+ 避免被误当成整份备份收着。
765
+
766
+ ⚠️ **过滤只作用于 `accounts` 与 `credentials` 两个字段**:模型黑名单与永久积分锁定表
767
+ 仍按**全量**写出。这样「只导一个账号」的产物依旧是**一份可整体还原的自包含快照** ——
768
+ 让过滤只承担一种语义,两条路径就不会互相污染。
769
+
770
+ ### 导入:两种模式(`replace` / `merge`)
771
+
772
+ | 模式 | 语义 | 用于 |
773
+ |---|---|---|
774
+ | `replace`(默认) | **整体替换**账号池与模型黑名单,还原快照 | 「恢复」按钮、换 DSH 版本后整体迁移 |
775
+ | `merge` | **只追加**:已存在的账号一律跳过,**不碰**模型黑名单与锁定表 | 「单独导入一个账号」、从别人的备份里挑账号 |
776
+
777
+ 导入弹窗可勾选要落地哪些账号,并选择模式。
778
+
779
+ ⚠️ **`merge` 下裁剪发生在发请求之前**(`plugin-src/client/backup-payload.js`)。
780
+ 判重虽然在后端,但后端只知道「这份载荷里有哪些账号」,不知道用户勾了哪几个;
781
+ 不先裁剪的话,从整份备份里只勾一个账号,其余账号仍会被追加,更糟的是备份里那些
782
+ **不在勾选范围内**的 `credentialRef` 可能已被本机现有账号占用,写进去等于
783
+ **覆盖现有账号的凭据**,与「只增加不覆盖」的承诺相反。故裁剪必须同时裁掉
784
+ `accounts`、`credentials` 与 `disabledModels` 三处。
785
+
786
+ ### ⚠️ 合并导入判重的三层口径(缺一层就会堆出重复账号)
787
+
788
+ `src/backup.ts` 的 `importBackup({ mode: 'merge' })` 依次判:
789
+
790
+ 1. **池里已有的 `id`** —— 账号的唯一键;
791
+ 2. **池里已有的身份**(`provider:` + 凭据里的身份字段,见下表);
792
+ 3. **备份文件内部重复的 `id`** —— 同一份文件手工编辑后可能出现两条同 id。
793
+
794
+ ⚠️ **只按 `id` 判重是不够的,第 2 层才是关键**:插件自己登录时 `id` 由 `shortId()`
795
+ **随机**生成(`buddy-a1b2c3d4`),而从第三方文件转换来的 id 是**确定性哈希**
796
+ (见下节)。同一个人因此有两套 id,只比 id 会把他重复加进池里 —— 而用户在
797
+ 「从别人的备份里挑账号」时,最常见的情形恰恰是「这个号我已经手登过了」。
798
+
799
+ ⚠️ **身份字段逐 provider 对齐**(漏一个字段,那个 provider 的「同一个号我已手登过」
800
+ 场景就**必然**多一条重复账号):
801
+
802
+ | 字段 | 哪些 provider 的凭据里有 |
803
+ |---|---|
804
+ | `user_id` | CodeBuddy / WorkBuddy / LobsterAI / Raccoon / ZCode |
805
+ | `uid` | Qoder(含中国版)/ TRAE |
806
+ | `userid` | Loomy |
807
+ | `account_id` | Cline / MiniMax |
808
+ | `sub` | Gemini(OIDC `sub`;**不取 `email`** —— 它会随改邮箱而变) |
809
+ | `api_key` | OpenCode(**仅账号槽**) |
810
+
811
+ ⚠️ **Gemini 只认 `sub`,不认 `email`**:两者都在它的凭据里,但 `sub` 是 OIDC 的
812
+ **稳定主体标识**(换邮箱、改昵称都不变,上游就拿它当账号 id),而 `email` 会随用户
813
+ 改邮箱而变 —— 拿它判重会让同一个账号在改邮箱后多出一条重复账号。
814
+
815
+ ⚠️ **OpenCode 的匿名通道要排除**:它的凭据只有 `api_key`,而匿名通道的 `api_key`
816
+ 恒为字面量 `public` —— 全部匿名槽共用一个值。若拿它当身份,用户刻意添加的
817
+ **第二条匿名通道会被判成「已存在」而拒绝导入**(「多条匿名通道各走各的出口」
818
+ 是上游明确提供的能力)。故匿名槽不产生身份,退回按 `id` 判重。
819
+
820
+ ⚠️ **轮换令牌(`access_token` / `refresh_token`)不能当身份**:它们每次续期都会变,
821
+ 拿来判重会让续期后的同一账号被判成新账号。
822
+
823
+ ⚠️ **`id` 与身份都可能判不出来**:凭据缺失/损坏时按「无法判断」跳过该条,
824
+ 不让一次判重失败阻断整体导入。
825
+
826
+ ### ⚠️ 第三方账号列表可以直接导入(自动转换)
827
+
828
+ 很多用户手上的是**别的工具**(账号池 / 卡号池脚本、IDE 本地缓存导出)产生的
829
+ CodeBuddy 账号列表,而不是本插件备份。两者结构完全不同:
830
+
831
+ | | 第三方账号列表 | 本插件备份 |
832
+ |---|---|---|
833
+ | 顶层 | **裸数组** `[ {...} ]`(或 `{ accounts / data / items / list: [...] }`) | 对象 `{ format, version, ... }` |
834
+ | 格式标记 | 无 | `format: 'dsh-codearts-auth/backup'` |
835
+ | 凭据 | 账号对象里**直接带** `access_token` / `refresh_token` | 独立 `credentials` 字典(ref → 凭据 JSON **原文字符串**) |
836
+ | 账号索引 | `id` 是 uid 或工具自己的编号 | `accounts[]`,`id` 形如 `buddy-a1b2c3d4` |
837
+
838
+ 直接把它丢给「恢复」只会得到「该备份文件里没有账号」—— 因为取不到 `accounts`。
839
+ 故选中这类文件时会**自动识别并转换**(`plugin-src/client/backup-convert.js`),
840
+ 转换结果显示在弹窗里供核对,并**默认落到 `merge` 模式**(别人的新号,避免误覆盖本机账号)。
841
+
842
+ ⚠️ **转换只改结构,不改写令牌**:`access_token` / `refresh_token` 原样搬运。
843
+ 其余字段以「本机一个真实可用的 CodeBuddy 凭据」为基准对齐:
844
+
845
+ | 字段 | 来源 |
846
+ |---|---|
847
+ | `expires_at` | 原值(**毫秒**时间戳),统一成字符串毫秒 |
848
+ | `refresh_expires_at` | 优先 `auth_raw` 的 `refreshExpiresIn - expiresIn` 差值补算,退回 refresh_token 的 JWT `exp` |
849
+ | `domain` | **access_token 的 JWT `iss` 主机名**(它会被当作 `X-Domain` 头发出去) |
850
+ | `user_id` | access_token 的 JWT `sub` |
851
+ | `token_type` / `account_type` | 原值,缺省 `Bearer` / `personal` |
852
+ | `enterprise_id` | 缺省 `''`(个人版为空串,与真实凭据一致) |
853
+
854
+ ⚠️ **provider 按 JWT `iss` 的主机名分派**:含 `workbuddy` → 国际版,否则 → `buddy`。
855
+ 两套 provider 是**不同路由**,认错会让凭据发到错误的端点。
856
+
857
+ ⚠️ **账号 id 由 uid 经 FNV-1a 哈希确定性生成**(`stableShortId`),与插件自己登录
858
+ 生成的形式一致。这样**同一份文件导入两次,第二次会全部被判为「已存在」而跳过**,
859
+ 而不是堆出两份账号。但 id 判重挡不住「同一个人的账号已用随机 id 登录在本机」——
860
+ 那正是靠上文第 2 层的身份字段判重。
861
+
862
+ ⚠️ **不写 `scope`**:真实凭据里有它,但插件**从不读取** `scope` 发请求
863
+ (只在续期时原样带回),而第三方文件里也没有 —— 与其猜一个可能不准的值,不如省略。
864
+
865
+ ### ⚠️ 合并导入只写「真正要新增的账号」的凭据
866
+
867
+ `merge` 模式下**绝不回写备份里其余凭据**(含各 provider 的默认单凭据 ref)。
868
+ `replace` 模式才按字典逐条写入 —— 备份文件里可能含账号池之外的独立凭据 ref,
869
+ 导出时一并纳入,导入时同样还原。
870
+
871
+ ⚠️ 写入顺序是**先凭据、后账号池**:账号池写入成功后门控(`hasLoggedInAccount`)
872
+ 与黑名单立即反映新状态;凭据写入中途失败(非法 ref 等)只跳过该条、不中断整体。
873
+
874
+ ⚠️ **模式必须取白名单**(`req?.mode === 'merge' ? 'merge' : 'replace'`),
875
+ 不能把请求里的任意字符串透传下去:未知值会被 `?? 'replace'` 静默当成整体替换 ——
876
+ 那时用户以为只是「加一个账号」,实际账号池被清空,属于**不可逆的数据损失**。
877
+
878
+ ### 测试
879
+
880
+ - `tests/unit/backup.spec.ts`(44 条)—— 选择性导出、合并导入三层判重、
881
+ `merge` 不回写其余凭据、`replace` 兼容旧行为、各 provider 的身份字段覆盖度;
882
+ - `tests/unit/backup-payload.spec.ts`(13 条)—— 载荷裁剪与账号摘要;
883
+ - `tests/unit/backup-convert.spec.ts`(28 条)—— 第三方列表识别与转换;
884
+ - `tests/unit/account-pool.spec.ts` 的 `mergeAccounts` 段(6 条)—— 只追加、
885
+ 不改黑名单与锁定、坏条目归一化、文件内重复 id。
886
+
887
+ ### ⚠️ 与上游同步(2026-10-02)
888
+
889
+ 本章功能已随上游 62 个提交(新增 OpenCode provider、本机 OpenAI 网关、用量徽标、
890
+ 自动签到、供应商开关)重新落地:只有 `plugin-src/client/jet-hub.js` 的 import 块
891
+ 需要手工合并,`BackupPanel` 与 `src/backup.ts` 上游未改动。唯一的适配点是
892
+ **OpenCode 的身份字段**(见上表与匿名槽说明)。细节与反向验证记录见 `AGENTS.md`
893
+ 的「上游同步记录」一节。
894
+
895
+ ⚠️ 已做**反向验证**(2026-09-30):禁用身份判重 → 1 条变红;让 `merge` 回写全部
896
+ 凭据 → 3 条变红;`mergeAccounts` 去掉文件内去重 → 1 条变红。
897
+
898
+ ## 开发
899
+
900
+ ```sh
901
+ pnpm test # 单元测试(快速,无网络,全部 mock)
902
+ pnpm typecheck # 只做类型检查
903
+ pnpm build:all # 完整构建(宿主 tsc + 资源拷贝 + 客户端 esbuild)
904
+ ```
905
+
906
+ ### 构建
907
+
908
+ - `pnpm build` — 用 tsc 将 `src/` 编译到 `lib/`。插件**宿主侧**入口是 `lib/index.js`。
909
+ - `pnpm build:client` — 用 esbuild 将 `plugin-src/client/` 打包为
910
+ `lib/client/jet-hub.js`(Jet Hub 设置页的客户端 bundle)。
911
+ - `pnpm build:all` — 依次执行上述步骤,是完整的构建。
912
+ - `pnpm typecheck` — 只做类型检查,不产出文件。
913
+
914
+ `lib/` 已被 gitignore,因此构建是安装或运行前的必需步骤。
915
+
916
+ ### E2E 测试
917
+
918
+ E2E 探针**按 provider 分列**(如 `pnpm test:e2e:codearts`、`pnpm test:e2e:buddy`、
919
+ `pnpm test:e2e:loomy`),**均有闸门、默认全部跳过** —— 需要显式设置对应环境变量
920
+ (部分还需 `..._CONFIRM=yes`)才会真正发出请求。详见 `tests/e2e/README.md`。
921
+
922
+ ⚠️ 带 `-claim` / `-chat` / `-tools` 后缀的探针会**真实消耗额度或领取机会**;
923
+ 带 `-refresh` 后缀的会**真实轮换一次凭据**(如 `accio-refresh`)。运行前请确认。
924
+
925
+ ### 项目结构
926
+
927
+ | 路径 | 说明 |
928
+ |---|---|
929
+ | `src/` | TypeScript 源码(宿主侧) |
930
+ | `plugin-src/client/` | Jet Hub 客户端源码(esbuild 打包) |
931
+ | `lib/` | 编译产物(已 gitignore) |
932
+ | `tests/unit/` | 单元测试 |
933
+ | `tests/e2e/` | 端到端测试(默认跳过) |
934
+ | `docs/agent-notes/` | 逐 provider 的事故史与约定(开发向) |
935
+ | `docs/implementation-notes.md` | **全部实现细节与协议笔记(不入库)**。⚠️ **目前没有 accio 章节** —— accio 的实测笔记在 `docs/agent-notes/providers-accio.md`,补写该章节是独立任务 |
936
+ | `cordis.patch.yml` | DSH bundle 补丁 |