cartethyia 2.7.7 → 2.7.9

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 (372) hide show
  1. package/.env.example +0 -1
  2. package/README.md +29 -59
  3. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
  5. package/dist/dashboard/assets/{CliToolDetailPage-CLUhmjUy.js → CliToolDetailPage-ixwgKk53.js} +1 -1
  6. package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-CQmrqqrk.js → CliToolsPage-BmttNV3U.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
  17. package/dist/dashboard/assets/{InjectSystemPromptPanel-C-e2AMz6.js → InjectSystemPromptPanel-BOoO8rpz.js} +2 -2
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-J8wPbmfT.js → LoginPage-ChJuNNVN.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-C6WlpU5E.js → ModelPicker-BZAJtPg1.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +8 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-BBTRBAQ3.js → ProxyPage-BJ87Pp0U.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
  33. package/dist/dashboard/assets/{QuotaPage-B2WqMSG1.js → QuotaPage-gkSyRAKa.js} +1 -1
  34. package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-LND6_Ss7.js → SetupPage-CFNcATJJ.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-BzNnm6Bi.js → StudioPage-YoD4tY5l.js} +1 -1
  40. package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js +1 -0
  44. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
  45. package/dist/dashboard/assets/app-BX2nnKqs.css +2 -0
  46. package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
  47. package/dist/dashboard/assets/assert-CndthXFQ.js +1 -0
  48. package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-BaX2GTrn.js → badge-DdbT_7Am.js} +1 -1
  50. package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
  51. package/dist/dashboard/assets/ban-durations-B58FyRxC.js +1 -0
  52. package/dist/dashboard/assets/ban-durations-B58FyRxC.js.gz +0 -0
  53. package/dist/dashboard/assets/{banner-DFH4Bkte.js → banner-CsGN-nbm.js} +1 -1
  54. package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
  55. package/dist/dashboard/assets/brand/bansos_page.webp +0 -0
  56. package/dist/dashboard/assets/brand/denia_bansos.webp +0 -0
  57. package/dist/dashboard/assets/brand/favicon.webp +0 -0
  58. package/dist/dashboard/assets/brand/login_register.webp +0 -0
  59. package/dist/dashboard/assets/brand/login_register_initial.webp +0 -0
  60. package/dist/dashboard/assets/brand/og_bansos.webp +0 -0
  61. package/dist/dashboard/assets/brand/og_image.webp +0 -0
  62. package/dist/dashboard/assets/brand/sidebar_ico.webp +0 -0
  63. package/dist/dashboard/assets/{card-CxDw0lK6.js → card-mgZ_TLLZ.js} +1 -1
  64. package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
  65. package/dist/dashboard/assets/cli-tools-A1-v8-03.js +1 -0
  66. package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
  67. package/dist/dashboard/assets/{clipboard-button-DfS1ntiq.js → clipboard-button-CJ4Zty89.js} +1 -1
  68. package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
  69. package/dist/dashboard/assets/{dialog-BK-NRr5u.js → dialog-B5L2jPQ_.js} +1 -1
  70. package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
  71. package/dist/dashboard/assets/{drawer-QqPul6sC.js → drawer-DkjUouAj.js} +1 -1
  72. package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
  73. package/dist/dashboard/assets/{entry-BMlYJVFj.js → entry-B-LVLV6o.js} +1 -1
  74. package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-CAhdYl3B.js +1 -0
  76. package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D2xD0Tmd.js +4 -0
  78. package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
  79. package/dist/dashboard/assets/{formatters-DP-5E01-.js → formatters-CrsdLVsn.js} +1 -1
  80. package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
  81. package/dist/dashboard/assets/{index-D36vCZht.js → index-BU64Lqvp.js} +2 -2
  82. package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
  83. package/dist/dashboard/assets/{inline-CHJQwxLa.js → inline-B2aDLyyg.js} +1 -1
  84. package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
  85. package/dist/dashboard/assets/{input-BlmlizVV.js → input-BCVkdR9d.js} +1 -1
  86. package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
  87. package/dist/dashboard/assets/{layout-Bz93I-yE.js → layout-DNcAdMK-.js} +1 -1
  88. package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
  89. package/dist/dashboard/assets/{list-row-Ml16KCfu.js → list-row-DgrIH0hw.js} +1 -1
  90. package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
  91. package/dist/dashboard/assets/{live-7_QpnYGu.js → live-Cae01iu8.js} +1 -1
  92. package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
  93. package/dist/dashboard/assets/{mutation-GU7XdEjz.js → mutation-BQ0ccH_A.js} +1 -1
  94. package/dist/dashboard/assets/mutation-BQ0ccH_A.js.gz +0 -0
  95. package/dist/dashboard/assets/{network-CuMDaTzT.js → network-CRib7H_2.js} +1 -1
  96. package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
  97. package/dist/dashboard/assets/{numbers-CoqpaDMx.js → numbers-BKQE8Xpz.js} +1 -1
  98. package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
  99. package/dist/dashboard/assets/{pagination-B5aOoweZ.js → pagination-ecPvG_8g.js} +1 -1
  100. package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
  101. package/dist/dashboard/assets/providers/devin.svg +9 -0
  102. package/dist/dashboard/assets/providers/devin.svg.gz +0 -0
  103. package/dist/dashboard/assets/providers/windsurf.svg +10 -0
  104. package/dist/dashboard/assets/providers/windsurf.svg.gz +0 -0
  105. package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
  106. package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
  107. package/dist/dashboard/assets/routing-Ckm1UXuC.js +1 -0
  108. package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
  109. package/dist/dashboard/assets/{select-C9Ssle9b.js → select-ChoFWyKz.js} +1 -1
  110. package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
  111. package/dist/dashboard/assets/settings-CKjFPlKW.js +1 -0
  112. package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
  113. package/dist/dashboard/assets/{stack-j7cXjgYX.js → stack-DWCwU3fh.js} +1 -1
  114. package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
  115. package/dist/dashboard/assets/{state-DHmEnLa2.js → state-Cg3VL5J_.js} +1 -1
  116. package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
  117. package/dist/dashboard/assets/story/25817331.webp +0 -0
  118. package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
  119. package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
  120. package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
  121. package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
  122. package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
  123. package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
  124. package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
  125. package/dist/dashboard/assets/{switch-DmZcyTIC.js → switch-Db70BMix.js} +1 -1
  126. package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
  127. package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BqdE0LuM.js} +1 -1
  128. package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
  129. package/dist/dashboard/console-backgrounds.webp +0 -0
  130. package/dist/dashboard/console-backgrounds_initial.webp +0 -0
  131. package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
  132. package/dist/dashboard/index.html +3 -3
  133. package/dist/dashboard/index.html.gz +0 -0
  134. package/dist/dashboard/precompressed-assets.json +57 -55
  135. package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
  136. package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  137. package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
  138. package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  139. package/package.json +1 -1
  140. package/src/boot/dependencies.ts +11 -3
  141. package/src/config/cooldowns.ts +1 -1
  142. package/src/config/spec.ts +0 -6
  143. package/src/console/api-keys/routes.ts +11 -4
  144. package/src/console/console-router.ts +7 -0
  145. package/src/console/dashboard-assets.ts +5 -5
  146. package/src/console/domain-registration.ts +27 -0
  147. package/src/console/ip-bans/routes.ts +99 -0
  148. package/src/console/providers/catalog/catalog-projections.ts +5 -2
  149. package/src/console/providers/catalog/contracts.ts +123 -0
  150. package/src/console/providers/catalog/model-operations.ts +122 -10
  151. package/src/console/providers/catalog/provider-operations.ts +116 -8
  152. package/src/console/providers/catalog/public-model-store.ts +0 -0
  153. package/src/console/providers/catalog/routes.ts +64 -4
  154. package/src/console/providers/catalog/store-helpers.ts +30 -1
  155. package/src/console/providers/catalog/store.ts +243 -3
  156. package/src/console/quota/account-quota-global.ts +89 -1
  157. package/src/console/quota/native-identity.ts +2 -0
  158. package/src/console/settings/contracts.ts +18 -0
  159. package/src/console/settings/store.ts +32 -0
  160. package/src/console/system-prompt/contracts.ts +0 -1
  161. package/src/main.ts +1 -0
  162. package/src/observability/event-query.ts +18 -4
  163. package/src/persistence/dialect.ts +12 -0
  164. package/src/persistence/schema.ts +20 -2
  165. package/src/protocol/dsml.ts +1 -1
  166. package/src/protocol/gateway-error.ts +1 -0
  167. package/src/protocol/reasoning.ts +1 -1
  168. package/src/protocol/request/chat.ts +4 -4
  169. package/src/protocol/request/messages.ts +1 -1
  170. package/src/protocol/response/gemini.ts +6 -1
  171. package/src/protocol/sse-decoder.ts +25 -8
  172. package/src/protocol/stream-error-frames.ts +13 -3
  173. package/src/protocol/translation/quirks.ts +1 -1
  174. package/src/protocol/translation/tool-repair.ts +2 -2
  175. package/src/protocol/upstream/send-claude-messages.ts +15 -4
  176. package/src/protocol/upstream-parsing.ts +1 -1
  177. package/src/providers/adapters/compatible-adapter.ts +7 -5
  178. package/src/providers/authentication/oauth-refresh-service.ts +149 -36
  179. package/src/providers/default-registry.ts +68 -3
  180. package/src/providers/discovery/discovery-types.ts +12 -0
  181. package/src/providers/discovery/probe-phases.ts +61 -30
  182. package/src/providers/discovery/probing-service.ts +279 -164
  183. package/src/providers/integrations/antigravity/antigravity-protocol.ts +117 -2
  184. package/src/providers/integrations/antigravity/antigravity.ts +13 -2
  185. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
  186. package/src/providers/integrations/buddy/buddy-chat-shared.ts +18 -18
  187. package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
  188. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
  189. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
  190. package/src/providers/integrations/buddy/buddy-identity.ts +70 -0
  191. package/src/providers/integrations/buddy/buddy-media.ts +4 -5
  192. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
  193. package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
  194. package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
  195. package/src/providers/integrations/buddy/capabilities.ts +4 -41
  196. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
  197. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +20 -1
  198. package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
  199. package/src/providers/integrations/buddy/codebuddy/shared.ts +6 -10
  200. package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
  201. package/src/providers/integrations/cursor/cursor-exec.ts +738 -0
  202. package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
  203. package/src/providers/integrations/cursor/cursor-request.ts +9 -8
  204. package/src/providers/integrations/cursor/cursor-shared.ts +19 -1
  205. package/src/providers/integrations/cursor/cursor.ts +50 -30
  206. package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
  207. package/src/providers/integrations/devin/devin-auth.ts +353 -0
  208. package/src/providers/integrations/devin/devin-catalog.ts +207 -0
  209. package/src/providers/integrations/devin/devin-http.ts +91 -0
  210. package/src/providers/integrations/devin/devin-quota.ts +214 -0
  211. package/src/providers/integrations/devin/devin-shared.ts +111 -0
  212. package/src/providers/integrations/devin/devin.ts +539 -0
  213. package/src/providers/integrations/devin/protocol/devin-proto.ts +584 -0
  214. package/src/providers/integrations/devin/protocol/framing.ts +124 -0
  215. package/src/providers/integrations/factory/factory.ts +2 -2
  216. package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
  217. package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
  218. package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
  219. package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
  220. package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
  221. package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
  222. package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
  223. package/src/providers/integrations/freepi/freepi.ts +292 -0
  224. package/src/providers/integrations/gemini.ts +2 -2
  225. package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
  226. package/src/providers/integrations/hermes.ts +4 -12
  227. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  228. package/src/providers/integrations/perch/perch-catalog.ts +105 -0
  229. package/src/providers/integrations/perch/perch-oauth.ts +170 -0
  230. package/src/providers/integrations/perch/perch-protocol.ts +211 -0
  231. package/src/providers/integrations/perch/perch-quota.ts +137 -0
  232. package/src/providers/integrations/perch/perch-realm.ts +82 -0
  233. package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
  234. package/src/providers/integrations/perch/perch.ts +315 -0
  235. package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
  236. package/src/providers/integrations/qoder/chat-proto.ts +328 -328
  237. package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
  238. package/src/providers/integrations/qoder/qoder-adapter.ts +89 -28
  239. package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
  240. package/src/providers/integrations/qoder/qoder-catalog.ts +6 -1
  241. package/src/providers/integrations/qoder/qoder-checkin.ts +2 -2
  242. package/src/providers/integrations/qoder/qoder-grpc.ts +209 -5
  243. package/src/providers/integrations/qoder/qoder-ide.ts +5 -1
  244. package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
  245. package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
  246. package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
  247. package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
  248. package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
  249. package/src/providers/integrations/qoder/qoder.ts +3 -6
  250. package/src/providers/integrations/trae/trae-catalog.ts +9 -14
  251. package/src/providers/integrations/trae/trae-headers.ts +36 -11
  252. package/src/providers/integrations/trae/trae-oauth.ts +14 -17
  253. package/src/providers/integrations/trae/trae-protocol.ts +3 -6
  254. package/src/providers/integrations/trae/trae-quota.ts +103 -21
  255. package/src/providers/integrations/trae/trae-realm.ts +36 -15
  256. package/src/providers/integrations/trae/trae.ts +97 -7
  257. package/src/providers/operations/account-error-classification.ts +66 -1
  258. package/src/providers/operations/account-health-service.ts +192 -26
  259. package/src/providers/operations/account-refresh-status.ts +284 -0
  260. package/src/providers/operations/account-tier.ts +67 -0
  261. package/src/providers/operations/byok-wire-profile.ts +9 -12
  262. package/src/providers/operations/client-versions.ts +37 -99
  263. package/src/providers/operations/cooldown-rules.ts +61 -0
  264. package/src/providers/operations/provider-catalog-seeder.ts +4 -0
  265. package/src/providers/provider-contracts.ts +29 -0
  266. package/src/providers/provider-metadata.ts +59 -4
  267. package/src/providers/provider-model-definition.ts +36 -0
  268. package/src/providers/quota/refresh.ts +21 -0
  269. package/src/security/abuse.ts +71 -0
  270. package/src/transport/dispatch/proxy-request.ts +1 -0
  271. package/src/transport/dispatch/streaming/stream.ts +1 -0
  272. package/src/transport/dispatch/upstream.ts +4 -1
  273. package/src/transport/failure-policy.ts +113 -7
  274. package/src/transport/routing/router.ts +25 -1
  275. package/src/transport/surface/messages/adapter.ts +2 -1
  276. package/src/transport/surface/responses/encode.ts +12 -1
  277. package/src/workers/daily-checkin.ts +1 -1
  278. package/src/workers/quota-refresh-sweep.ts +1 -1
  279. package/src/workers/scheduler.ts +22 -4
  280. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js +0 -1
  281. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js.gz +0 -0
  282. package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js.gz +0 -0
  283. package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js.gz +0 -0
  284. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js +0 -1
  285. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js.gz +0 -0
  286. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js +0 -1
  287. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js.gz +0 -0
  288. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js +0 -1
  289. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js.gz +0 -0
  290. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js +0 -1
  291. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js.gz +0 -0
  292. package/dist/dashboard/assets/InjectSystemPromptPanel-C-e2AMz6.js.gz +0 -0
  293. package/dist/dashboard/assets/LoginPage-J8wPbmfT.js.gz +0 -0
  294. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  295. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js +0 -1
  296. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js.gz +0 -0
  297. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js +0 -7
  298. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js.gz +0 -0
  299. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
  300. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  301. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js +0 -1
  302. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js.gz +0 -0
  303. package/dist/dashboard/assets/ProxyPage-BBTRBAQ3.js.gz +0 -0
  304. package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js.gz +0 -0
  305. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js +0 -1
  306. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js.gz +0 -0
  307. package/dist/dashboard/assets/SetupPage-LND6_Ss7.js.gz +0 -0
  308. package/dist/dashboard/assets/StudioPage-BzNnm6Bi.js.gz +0 -0
  309. package/dist/dashboard/assets/UsagePage-C1TbL24N.js +0 -56
  310. package/dist/dashboard/assets/UsagePage-C1TbL24N.js.gz +0 -0
  311. package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
  312. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  313. package/dist/dashboard/assets/app-mweRcsKp.css +0 -2
  314. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  315. package/dist/dashboard/assets/assert-CidQVoNo.js +0 -1
  316. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  317. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  318. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  319. package/dist/dashboard/assets/brand/bansos_page.png +0 -0
  320. package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
  321. package/dist/dashboard/assets/brand/favicon.jpg +0 -0
  322. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  323. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  324. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  325. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  326. package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
  327. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  328. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
  329. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  330. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  331. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  332. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  333. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  334. package/dist/dashboard/assets/entry-Dmx7gBiN.js +0 -1
  335. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  336. package/dist/dashboard/assets/entry-vqGb8yVz.js +0 -4
  337. package/dist/dashboard/assets/entry-vqGb8yVz.js.gz +0 -0
  338. package/dist/dashboard/assets/formatters-DP-5E01-.js.gz +0 -0
  339. package/dist/dashboard/assets/index-D36vCZht.js.gz +0 -0
  340. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  341. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  342. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  343. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  344. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  345. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
  346. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
  347. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  348. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  349. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  350. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  351. package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
  352. package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
  353. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  354. package/dist/dashboard/assets/select-C9Ssle9b.js.gz +0 -0
  355. package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
  356. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  357. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  358. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  359. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  360. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  361. package/dist/dashboard/console-backgrounds.jpg +0 -0
  362. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  363. package/dist/dashboard/donation/qris-risun-marke.png +0 -0
  364. package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
  365. package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
  366. package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
  367. package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
  368. package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
  369. package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
  370. package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
  371. /package/dist/dashboard/assets/{app-DRnQLhsc.js → app-B7kIWFm5.js} +0 -0
  372. /package/dist/dashboard/assets/{app-DRnQLhsc.js.gz → app-B7kIWFm5.js.gz} +0 -0
@@ -1,5 +1,6 @@
1
1
  import type { ProviderDispatchContext } from "../../provider-contracts";
2
2
  import { createHash } from "node:crypto";
3
+ import { readFileSync } from "node:fs";
3
4
  import { decodeJwtPayload } from "../../authentication/oauth-flow-store";
4
5
  import { buddyAccountUid } from "./buddy-oauth-shared";
5
6
  import type { CanonicalRequest } from "../../../protocol/canonical-model";
@@ -228,3 +229,72 @@ export function buddyAgentPurpose(
228
229
  if (typeof fromRequest === "string" && fromRequest.trim().length > 0) return fromRequest.trim();
229
230
  return undefined;
230
231
  }
232
+
233
+ /**
234
+ * Desktop risk token, sent only when the account actually has one.
235
+ *
236
+ * The account's own `auth_state` wins. When it carries none, a file the
237
+ * desktop client writes (`CARTETHYIA_DEVICE_TOKEN_FILE`, default
238
+ * `/app/data/device_token`) is read instead — cached for five minutes, and
239
+ * ignored when it is larger than 1 KB, because a token file that size is not
240
+ * a token. A missing file is the normal case and reads as "no token".
241
+ */
242
+ const DEVICE_TOKEN_FILE_MAX_BYTES = 1024;
243
+ const DEVICE_TOKEN_FILE_TTL_MS = 5 * 60_000;
244
+ let deviceTokenFileCache: { readonly value: string | undefined; readonly readAt: number } | undefined;
245
+
246
+ export function readBuddyDeviceToken(context?: ProviderDispatchContext): string | undefined {
247
+ const state = context?.credential.auth_state;
248
+ const value = state?.["deviceToken"] ?? state?.["device_token"];
249
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
250
+ return readDeviceTokenFile();
251
+ }
252
+
253
+ /**
254
+ * The reference `X-Device-Token` pair, per the official desktop app.
255
+ *
256
+ * The desktop client always presents one of the
257
+ * two on chat traffic — a real token from the TuringShield SDK, or an
258
+ * `X-Device-Token-Error` when the SDK cannot produce one. It never omits both,
259
+ * and it sends the header on every realm (Intl and CN alike).
260
+ *
261
+ * The TuringShield SDK was a proprietary native addon shipped under
262
+ * `vendor/turing-sdk/`; it has been removed. The fallback path below is the
263
+ * captured token (auth_state / `CARTETHYIA_DEVICE_TOKEN_FILE`) and then the
264
+ * official failure state.
265
+ *
266
+ * - Legacy token (auth_state/file) → used when no SDK is available.
267
+ * - CLI identity never carries a device token (the CLI has no device).
268
+ */
269
+ export async function buddyDeviceTokenHeaders(args: {
270
+ realm: "intl" | "cn";
271
+ context: ProviderDispatchContext | undefined;
272
+ cliIdentity: boolean | undefined;
273
+ }): Promise<Record<string, string>> {
274
+ const { context, cliIdentity } = args;
275
+ void args.realm; // the desktop client sends the token on both realms
276
+ if (resolveBuddyIdentity(context, cliIdentity) === "cli") return {};
277
+ const token = readBuddyDeviceToken(context);
278
+ if (token !== undefined) return { "x-device-token": token };
279
+ return { "x-device-token-error": "sdk_not_initialized" };
280
+ }
281
+
282
+ function readDeviceTokenFile(): string | undefined {
283
+ const now = Date.now();
284
+ if (deviceTokenFileCache !== undefined && now - deviceTokenFileCache.readAt < DEVICE_TOKEN_FILE_TTL_MS) {
285
+ return deviceTokenFileCache.value;
286
+ }
287
+ const path = process.env["CARTETHYIA_DEVICE_TOKEN_FILE"] ?? "/app/data/device_token";
288
+ let value: string | undefined;
289
+ try {
290
+ const raw = readFileSync(path);
291
+ if (raw.byteLength > 0 && raw.byteLength <= DEVICE_TOKEN_FILE_MAX_BYTES) {
292
+ const text = raw.toString("utf8").trim();
293
+ if (text.length > 0) value = text;
294
+ }
295
+ } catch {
296
+ value = undefined;
297
+ }
298
+ deviceTokenFileCache = { value, readAt: now };
299
+ return value;
300
+ }
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Buddy-family media generation: image and video.
3
3
  *
4
- * CodeBuddy (intl) and WorkBuddy serve media through the same facade, so shared
5
- * request shaping lives here. Their image endpoint can differ by provider;
4
+ * CodeBuddy (intl + CN) serves media through the same facade, so shared
5
+ * request shaping lives here. Their image endpoint can differ by realm;
6
6
  * identity headers come from {@link codebuddyHeaders} keyed on the variant.
7
7
  *
8
- * Two image paths are supported: CodeBuddy can use its native
9
- * `/images/generations` API, while WorkBuddy keeps its chat-completion image
10
- * path. The configured provider path selects the wire format.
8
+ * The image path is CodeBuddy's native `/images/generations` API. The
9
+ * configured provider path selects the wire format.
11
10
  *
12
11
  * - **Video** (`seedance-2.5`) is implemented as an async task: submission
13
12
  * expects a task ID, then the adapter polls a sibling task URL until a clip
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The buddy-family device-login mechanism (`cb`, `cbcn`, `workbuddy`).
2
+ * The buddy-family device-login mechanism (`cb`, `cbcn`).
3
3
  *
4
4
  * All three complete device login against the same plugin auth endpoints: a
5
5
  * state POST, a token poll that answers the pending code `11217` until the user
@@ -64,7 +64,7 @@ export function strictResponseCode(payload: unknown): number | undefined {
64
64
  }
65
65
 
66
66
  /**
67
- * Reads the envelope `code` through `Number()`, which is how the WorkBuddy
67
+ * Reads the envelope `code` through `Number()`, which is how the buddy
68
68
  * gateway is read. Looser than `strictResponseCode` on a malformed payload: a
69
69
  * `null` code coerces to `0`, i.e. success, and `true` to `1`. Kept verbatim
70
70
  * rather than tightened because nothing here shows what that gateway sends for
@@ -2,7 +2,7 @@ import { asNumber as sharedAsNumber } from "../../../shared/coerce";
2
2
 
3
3
  /**
4
4
  * Shared Tencent billing-meter parsing for the CodeBuddy family
5
- * (`cb`, `cbcn`, `workbuddy`).
5
+ * (`cb`, `cbcn`).
6
6
  *
7
7
  * All three read the same endpoint shape — POST
8
8
  * `{base}/v2/billing/meter/get-user-resource` answering
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Real credit deductions for the Tencent "buddy" family (`cb`, `cbcn`,
3
- * `workbuddy`, `workbuddycn`).
4
- *
2
+ * Real credit deductions for the Tencent "buddy" family (`cb`, `cbcn`). *
5
3
  * Every provider in the family reads the same usage-detail endpoint —
6
4
  * `POST {billingHost}/billing/meter/get-user-request-usage` — which answers the
7
5
  * actual per-request deductions the billing meter recorded: when the request
@@ -1,14 +1,13 @@
1
1
  // dynamic-import-ok: lazy per-realm capability map. Each buddy regional
2
- // product (cb/cbcn/workbuddy/workbuddycn) imports its adapter + oauth +
3
- // discovery on first use so a deployment that only serves one realm never
4
- // drags the others into memory.
2
+ // product (cb/cbcn) imports its adapter + oauth + discovery on first use so a
3
+ // deployment that only serves one realm never drags the others into memory.
5
4
  import type { ProviderModuleCapabilities } from "../../provider-capabilities";
6
5
  import { oauthCapability, quotaCapability } from "../../provider-capabilities";
7
6
 
8
- type BuddyProviderId = "cb" | "cbcn" | "workbuddy" | "workbuddycn";
7
+ type BuddyProviderId = "cb" | "cbcn";
9
8
 
10
9
  /**
11
- * Lazy capability declarations for Buddy's four independently identified
10
+ * Lazy capability declarations for Buddy's two independently identified
12
11
  * regional products.
13
12
  */
14
13
  export const BUDDY_PROVIDER_CAPABILITIES = {
@@ -48,40 +47,4 @@ export const BUDDY_PROVIDER_CAPABILITIES = {
48
47
  "fetchCodeBuddyCnQuota",
49
48
  ),
50
49
  },
51
- workbuddy: {
52
- loadAdapter: async () => (await import("./workbuddy/provider")).createWorkBuddyAdapter(),
53
- loadModels: async () => (await import("./workbuddy/provider")).WORKBUDDY_MODELS,
54
- loadModelDiscovery: async () => async ({ credential, fetcher }) =>
55
- (await import("./workbuddy/provider")).discoverWorkBuddyModels({
56
- credential,
57
- ...(fetcher === undefined ? {} : { fetcher }),
58
- }),
59
- loadAuthentication: oauthCapability(
60
- () => import("./workbuddy/oauth"),
61
- "workBuddyOAuthClient",
62
- { withRefresher: true },
63
- ),
64
- loadQuotaCollector: quotaCapability(
65
- () => import("./workbuddy/quota"),
66
- "fetchWorkBuddyQuota",
67
- ),
68
- },
69
- workbuddycn: {
70
- loadAdapter: async () => (await import("./workbuddy/cn-provider")).createWorkBuddyCnAdapter(),
71
- loadModels: async () => (await import("./workbuddy/cn-provider")).WORKBUDDY_CN_MODELS,
72
- loadModelDiscovery: async () => async ({ credential, fetcher }) =>
73
- (await import("./workbuddy/cn-provider")).discoverWorkBuddyCnModels({
74
- credential,
75
- ...(fetcher === undefined ? {} : { fetcher }),
76
- }),
77
- loadAuthentication: oauthCapability(
78
- () => import("./workbuddy/cn-oauth"),
79
- "workBuddyCnOAuthClient",
80
- { withRefresher: true },
81
- ),
82
- loadQuotaCollector: quotaCapability(
83
- () => import("./workbuddy/quota"),
84
- "fetchWorkBuddyCnQuota",
85
- ),
86
- },
87
50
  } satisfies Readonly<Record<BuddyProviderId, ProviderModuleCapabilities>>;
@@ -24,7 +24,8 @@ export const CODEBUDDY_CN_RAW: readonly BuddyRawEntry[] = [
24
24
  ["kimi-k2.8-preview", "Kimi K2.8 Preview", true, true, 1_000_000, 64_000],
25
25
  ["kimi-k3.1-pro", "Kimi K3.1 Pro", true, true, 1_000_000, 32_000],
26
26
  ["hy3", "Hy3", true, true, 192_000, 64_000],
27
- ["hy4-preview", "Hy4 Preview", true, true, 960_000, 64_000],
27
+ ["hy4", "Hy4", true, true, 960_000, 64_000],
28
+ ["hy4free", "Hy4 Free", true, true, 960_000, 64_000],
28
29
  ["space-bunny", "Space Bunny", true, true, 1_000_000, 128_000],
29
30
  ["step-5-preview", "Step 5 Preview", true, true, 1_000_000, 64_000],
30
31
  ["deepseek-v4-pro", "DeepSeek V4 Pro", true, true, 1_000_000, 128_000],
@@ -20,7 +20,9 @@ import { CODEBUDDY_CN_RAW } from "./cn-catalog";
20
20
  import { CODEBUDDY_SYSTEM_PROMPT } from "./provider";
21
21
  import {
22
22
  BUDDY_CN_IMAGE_MODEL_ID_SET,
23
+ BUDDY_CN_VIDEO_MODEL_ID_SET,
23
24
  makeBuddyCnImageModels,
25
+ makeBuddyCnVideoModels,
24
26
  makeBuddyModel,
25
27
  } from "../buddy-catalog-shared";
26
28
  import { BUDDY_CN_MODELS_PATH, fetchBuddyDirectoryModels } from "../buddy-discovery-shared";
@@ -115,11 +117,28 @@ export const CODEBUDDY_CN_IMAGE_MODELS: readonly ModelDefinition[] = makeBuddyCn
115
117
  "/images/generations",
116
118
  );
117
119
 
120
+ /**
121
+ * CN's video-generation rows (`kling-video-v3`, `minimax-video-h3`).
122
+ *
123
+ * Reached through the native video route like the intl rows. The video ids
124
+ * are filtered out of the chat pass so one id never appears under two service
125
+ * kinds.
126
+ */
127
+ export const CODEBUDDY_CN_VIDEO_MODELS: readonly ModelDefinition[] = makeBuddyCnVideoModels(
128
+ CODEBUDDY_CN_PROVIDER_ID,
129
+ "/videos/generations",
130
+ );
131
+
118
132
  export const CODEBUDDY_CN_MODELS: readonly ModelDefinition[] = [
119
- ...CODEBUDDY_CN_RAW.filter((entry) => !BUDDY_CN_IMAGE_MODEL_ID_SET.has(entry[0])).map((entry) =>
133
+ ...CODEBUDDY_CN_RAW.filter(
134
+ (entry) =>
135
+ !BUDDY_CN_IMAGE_MODEL_ID_SET.has(entry[0]) &&
136
+ !BUDDY_CN_VIDEO_MODEL_ID_SET.has(entry[0]),
137
+ ).map((entry) =>
120
138
  makeBuddyModel(entry, CODEBUDDY_CN_PROVIDER_ID, undefined, "cn"),
121
139
  ),
122
140
  ...CODEBUDDY_CN_IMAGE_MODELS,
141
+ ...CODEBUDDY_CN_VIDEO_MODELS,
123
142
  ];
124
143
 
125
144
  /** Reads the CodeBuddy CN console directory (same envelope as the intl site). */
@@ -84,7 +84,7 @@ function codeBuddyIntlPrePayload(
84
84
  void request;
85
85
  }
86
86
 
87
- // Model catalog — shared CodeBuddy / WorkBuddy international roster
87
+ // Model catalog — shared CodeBuddy international roster
88
88
 
89
89
  const CODEBUDDY_INTL_RAW: readonly BuddyRawEntry[] = BUDDY_SHARED_RAW;
90
90
 
@@ -95,7 +95,7 @@ const CODEBUDDY_INTL_RAW: readonly BuddyRawEntry[] = BUDDY_SHARED_RAW;
95
95
  * why they were unreachable as image models: nothing downstream could tell a
96
96
  * chat model from one that returns an image, so `mediaGeneration` was false for
97
97
  * every catalog row. The roster and the declared capabilities come from
98
- * {@link makeBuddyImageModels} so cb and WorkBuddy cannot drift.
98
+ * {@link makeBuddyImageModels} so cb and cbcn cannot drift.
99
99
  */
100
100
  export const CODEBUDDY_IMAGE_MODELS: readonly ModelDefinition[] = makeBuddyImageModels(
101
101
  "cb",
@@ -13,8 +13,7 @@ import {
13
13
  resolveBuddyIdentity,
14
14
  } from "../buddy-identity";
15
15
  import { buildCodeBuddyUserAgent, getCodeBuddyCnVersion, getCodeBuddyVersion } from "../../../operations/client-versions";
16
- import { buddyDeviceTokenHeaders } from "../workbuddy/shared";
17
- import { CODEBUDDY_TURING_CONFIG } from "../turing-device-token";
16
+ import { buddyDeviceTokenHeaders } from "../buddy-identity";
18
17
  import { buddyCliHeaders, buddyCliTraceHeaders } from "../buddy-cli-headers";
19
18
 
20
19
  /** Client identity variant behind the per-request CodeBuddy headers. */
@@ -105,25 +104,22 @@ export async function codebuddyHeaders(
105
104
  // The reference does not invent `conversation`; it sends the purpose only
106
105
  // when one exists.
107
106
  ...(purpose === undefined ? {} : { "X-Agent-Purpose": purpose }),
108
- // Same family WorkBuddy sends: the upstream's channel check reads the
109
- // turn-level aggregation key, and a chat request without it is refused for a
110
- // missing conversation id.
107
+ // The upstream's channel check reads the turn-level aggregation key, and a
108
+ // chat request without it is refused for a missing conversation id.
111
109
  ...conversation,
112
110
  // Per-account device binding (qimei36) — distinct device per account.
113
111
  ...(() => {
114
112
  const binding = resolveBuddyDeviceBinding(context);
115
113
  return binding === undefined ? {} : { "X-Device-Id-List": JSON.stringify({ qimei36: binding }) };
116
114
  })(),
117
- // The desktop client sends the device-token pair on both realms. SDK
118
- // token when configured, captured token otherwise, or the official failure
119
- // placeholder. CodeBuddy uses its own SDK payload profile (same SDK,
120
- // distinct product identity). (CLI branch above already returned without
115
+ // The desktop client sends the device-token pair on both realms. Captured
116
+ // token (auth_state / device-token file) when present, otherwise the
117
+ // official failure placeholder. (CLI branch above already returned without
121
118
  // device headers.)
122
119
  ...(await buddyDeviceTokenHeaders({
123
120
  realm: identity === "IDE" ? "intl" : "cn",
124
121
  context,
125
122
  cliIdentity,
126
- turingConfig: CODEBUDDY_TURING_CONFIG,
127
123
  })),
128
124
  };
129
125
  }
@@ -19,6 +19,7 @@ import {
19
19
  FALLBACK_CLIENT_VERSION,
20
20
  SERVER_CONFIG_PATH,
21
21
  normalizeAgentRunOrigin,
22
+ resolveCursorTimezone,
22
23
  } from "./cursor-shared";
23
24
  import { createCursorChecksumHeader, resolveCursorDeviceIds } from "./cursor-identity";
24
25
 
@@ -66,6 +67,7 @@ async function unaryHeaders(
66
67
  "x-cursor-checksum": createCursorChecksumHeader(machineId, macMachineId),
67
68
  "x-ghost-mode": "true",
68
69
  "x-request-id": crypto.randomUUID(),
70
+ ...(resolveCursorTimezone() === "" ? {} : { "x-cursor-timezone": resolveCursorTimezone() }),
69
71
  };
70
72
  }
71
73