dsh-cliworker-now 0.0.0-stage → 0.7.7

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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +364 -0
  3. package/README.md +368 -2
  4. package/cordis.patch.yml +3 -0
  5. package/lib/account-models.mjs +262 -0
  6. package/lib/client.js +22139 -0
  7. package/lib/client.js.map +1 -0
  8. package/lib/grok-catalog.mjs +145 -0
  9. package/lib/hermes-native-entry.py +96 -0
  10. package/lib/hermes-nous-refresh.py +331 -0
  11. package/lib/index.js +14544 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/native-launch.mjs +234 -0
  14. package/lib/native-spawn.mjs +32 -0
  15. package/lib/own-account-lease.mjs +105 -0
  16. package/lib/pi-installation.mjs +87 -0
  17. package/lib/pi-login.mjs +80 -0
  18. package/lib/pi-native-catalog.mjs +417 -0
  19. package/lib/pi-omp-bridge.mjs +602 -0
  20. package/lib/pi-omp-environment.mjs +15 -0
  21. package/lib/pi-omp-refresh.mjs +324 -0
  22. package/lib/private-launch.mjs +23 -0
  23. package/lib/terminal-bridge.mjs +18 -0
  24. package/lib/typert.host.d.ts +3 -0
  25. package/lib/typert.host.js +1430 -0
  26. package/lib/typert.remote-client.d.ts +72 -0
  27. package/lib/typert.remote-client.d.ts.map +1 -0
  28. package/lib/typert.remote-client.js +1256 -0
  29. package/lib/types/client/account-query-queue.d.ts +16 -0
  30. package/lib/types/client/account-query-queue.js +61 -0
  31. package/lib/types/client/account-query-queue.js.map +1 -0
  32. package/lib/types/client/account-terminal-css.d.ts +1 -0
  33. package/lib/types/client/account-terminal-css.js +3 -0
  34. package/lib/types/client/account-terminal-css.js.map +1 -0
  35. package/lib/types/client/account-terminal.d.ts +17 -0
  36. package/lib/types/client/account-terminal.js +525 -0
  37. package/lib/types/client/account-terminal.js.map +1 -0
  38. package/lib/types/client/assets/antigravity.png +0 -0
  39. package/lib/types/client/assets/claude-code.png +0 -0
  40. package/lib/types/client/assets/cliworker-now-logo.png +0 -0
  41. package/lib/types/client/assets/codex.png +0 -0
  42. package/lib/types/client/assets/grok.png +0 -0
  43. package/lib/types/client/assets/hermes.png +0 -0
  44. package/lib/types/client/assets/kimi-dark.png +0 -0
  45. package/lib/types/client/assets/kimi-light.png +0 -0
  46. package/lib/types/client/assets/mimo-code.png +0 -0
  47. package/lib/types/client/assets/omp.png +0 -0
  48. package/lib/types/client/assets/opencode.png +0 -0
  49. package/lib/types/client/assets/pi.png +0 -0
  50. package/lib/types/client/assets/zcode.png +0 -0
  51. package/lib/types/client/composer-keymap.d.ts +18 -0
  52. package/lib/types/client/composer-keymap.js +49 -0
  53. package/lib/types/client/composer-keymap.js.map +1 -0
  54. package/lib/types/client/conversation-timeline.d.ts +6 -0
  55. package/lib/types/client/conversation-timeline.js +65 -0
  56. package/lib/types/client/conversation-timeline.js.map +1 -0
  57. package/lib/types/client/copy-text.d.ts +5 -0
  58. package/lib/types/client/copy-text.js +45 -0
  59. package/lib/types/client/copy-text.js.map +1 -0
  60. package/lib/types/client/icons.d.ts +21 -0
  61. package/lib/types/client/icons.js +68 -0
  62. package/lib/types/client/icons.js.map +1 -0
  63. package/lib/types/client/index.d.ts +3 -0
  64. package/lib/types/client/index.js +124 -0
  65. package/lib/types/client/index.js.map +1 -0
  66. package/lib/types/client/management-styles.d.ts +1 -0
  67. package/lib/types/client/management-styles.js +17 -0
  68. package/lib/types/client/management-styles.js.map +1 -0
  69. package/lib/types/client/name-copy.d.ts +5 -0
  70. package/lib/types/client/name-copy.js +107 -0
  71. package/lib/types/client/name-copy.js.map +1 -0
  72. package/lib/types/client/native-job-overlay.d.ts +11 -0
  73. package/lib/types/client/native-job-overlay.js +129 -0
  74. package/lib/types/client/native-job-overlay.js.map +1 -0
  75. package/lib/types/client/operation-error.d.ts +2 -0
  76. package/lib/types/client/operation-error.js +12 -0
  77. package/lib/types/client/operation-error.js.map +1 -0
  78. package/lib/types/client/panel.d.ts +8 -0
  79. package/lib/types/client/panel.js +310 -0
  80. package/lib/types/client/panel.js.map +1 -0
  81. package/lib/types/client/rename-copy-styles.d.ts +1 -0
  82. package/lib/types/client/rename-copy-styles.js +21 -0
  83. package/lib/types/client/rename-copy-styles.js.map +1 -0
  84. package/lib/types/client/rename-worker.d.ts +9 -0
  85. package/lib/types/client/rename-worker.js +53 -0
  86. package/lib/types/client/rename-worker.js.map +1 -0
  87. package/lib/types/client/role-presets.d.ts +6 -0
  88. package/lib/types/client/role-presets.js +111 -0
  89. package/lib/types/client/role-presets.js.map +1 -0
  90. package/lib/types/client/settings-dialog.d.ts +13 -0
  91. package/lib/types/client/settings-dialog.js +442 -0
  92. package/lib/types/client/settings-dialog.js.map +1 -0
  93. package/lib/types/client/stat-popover.d.ts +10 -0
  94. package/lib/types/client/stat-popover.js +32 -0
  95. package/lib/types/client/stat-popover.js.map +1 -0
  96. package/lib/types/client/styles.d.ts +9 -0
  97. package/lib/types/client/styles.js +221 -0
  98. package/lib/types/client/styles.js.map +1 -0
  99. package/lib/types/client/telemetry.d.ts +11 -0
  100. package/lib/types/client/telemetry.js +24 -0
  101. package/lib/types/client/telemetry.js.map +1 -0
  102. package/lib/types/client/worker-card.d.ts +10 -0
  103. package/lib/types/client/worker-card.js +75 -0
  104. package/lib/types/client/worker-card.js.map +1 -0
  105. package/lib/types/client/worker-model-menu.d.ts +9 -0
  106. package/lib/types/client/worker-model-menu.js +136 -0
  107. package/lib/types/client/worker-model-menu.js.map +1 -0
  108. package/lib/types/client/workers.d.ts +21 -0
  109. package/lib/types/client/workers.js +59 -0
  110. package/lib/types/client/workers.js.map +1 -0
  111. package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
  112. package/lib/types/client/zcode-login-link-provider.js +105 -0
  113. package/lib/types/client/zcode-login-link-provider.js.map +1 -0
  114. package/lib/types/client/zcode-login-link.d.ts +16 -0
  115. package/lib/types/client/zcode-login-link.js +194 -0
  116. package/lib/types/client/zcode-login-link.js.map +1 -0
  117. package/lib/types/host/account-identity.d.ts +16 -0
  118. package/lib/types/host/account-identity.js +126 -0
  119. package/lib/types/host/account-identity.js.map +1 -0
  120. package/lib/types/host/account-login.d.ts +10 -0
  121. package/lib/types/host/account-login.js +126 -0
  122. package/lib/types/host/account-login.js.map +1 -0
  123. package/lib/types/host/account-models.d.mts +21 -0
  124. package/lib/types/host/account-models.mjs +262 -0
  125. package/lib/types/host/accounts.d.ts +42 -0
  126. package/lib/types/host/accounts.js +945 -0
  127. package/lib/types/host/accounts.js.map +1 -0
  128. package/lib/types/host/adapters.d.ts +24 -0
  129. package/lib/types/host/adapters.js +380 -0
  130. package/lib/types/host/adapters.js.map +1 -0
  131. package/lib/types/host/agy-context.d.ts +8 -0
  132. package/lib/types/host/agy-context.js +122 -0
  133. package/lib/types/host/agy-context.js.map +1 -0
  134. package/lib/types/host/agy-models.d.ts +5 -0
  135. package/lib/types/host/agy-models.js +37 -0
  136. package/lib/types/host/agy-models.js.map +1 -0
  137. package/lib/types/host/agy-windows-account.d.ts +14 -0
  138. package/lib/types/host/agy-windows-account.js +104 -0
  139. package/lib/types/host/agy-windows-account.js.map +1 -0
  140. package/lib/types/host/authorized-catalog.d.ts +14 -0
  141. package/lib/types/host/authorized-catalog.js +35 -0
  142. package/lib/types/host/authorized-catalog.js.map +1 -0
  143. package/lib/types/host/bridge-protocol.d.ts +15 -0
  144. package/lib/types/host/bridge-protocol.js +80 -0
  145. package/lib/types/host/bridge-protocol.js.map +1 -0
  146. package/lib/types/host/claude-native-oauth.d.ts +17 -0
  147. package/lib/types/host/claude-native-oauth.js +272 -0
  148. package/lib/types/host/claude-native-oauth.js.map +1 -0
  149. package/lib/types/host/claude-own-route.d.ts +33 -0
  150. package/lib/types/host/claude-own-route.js +250 -0
  151. package/lib/types/host/claude-own-route.js.map +1 -0
  152. package/lib/types/host/cli-account-binding.d.ts +33 -0
  153. package/lib/types/host/cli-account-binding.js +540 -0
  154. package/lib/types/host/cli-account-binding.js.map +1 -0
  155. package/lib/types/host/cli-protocol.d.ts +27 -0
  156. package/lib/types/host/cli-protocol.js +212 -0
  157. package/lib/types/host/cli-protocol.js.map +1 -0
  158. package/lib/types/host/codex-account.d.ts +8 -0
  159. package/lib/types/host/codex-account.js +143 -0
  160. package/lib/types/host/codex-account.js.map +1 -0
  161. package/lib/types/host/codex-models.d.ts +6 -0
  162. package/lib/types/host/codex-models.js +169 -0
  163. package/lib/types/host/codex-models.js.map +1 -0
  164. package/lib/types/host/extended-adapters.d.ts +44 -0
  165. package/lib/types/host/extended-adapters.js +207 -0
  166. package/lib/types/host/extended-adapters.js.map +1 -0
  167. package/lib/types/host/first-party-account-context.d.ts +26 -0
  168. package/lib/types/host/first-party-account-context.js +55 -0
  169. package/lib/types/host/first-party-account-context.js.map +1 -0
  170. package/lib/types/host/first-party-models.d.ts +29 -0
  171. package/lib/types/host/first-party-models.js +459 -0
  172. package/lib/types/host/first-party-models.js.map +1 -0
  173. package/lib/types/host/grok-adapter.d.ts +44 -0
  174. package/lib/types/host/grok-adapter.js +293 -0
  175. package/lib/types/host/grok-adapter.js.map +1 -0
  176. package/lib/types/host/grok-models.d.ts +47 -0
  177. package/lib/types/host/grok-models.js +320 -0
  178. package/lib/types/host/grok-models.js.map +1 -0
  179. package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
  180. package/lib/types/host/harness-opencode-accounts.js +80 -0
  181. package/lib/types/host/harness-opencode-accounts.js.map +1 -0
  182. package/lib/types/host/hermes-account-context.d.ts +8 -0
  183. package/lib/types/host/hermes-account-context.js +99 -0
  184. package/lib/types/host/hermes-account-context.js.map +1 -0
  185. package/lib/types/host/hermes-accounts.d.ts +19 -0
  186. package/lib/types/host/hermes-accounts.js +356 -0
  187. package/lib/types/host/hermes-accounts.js.map +1 -0
  188. package/lib/types/host/hermes-adapter.d.ts +93 -0
  189. package/lib/types/host/hermes-adapter.js +455 -0
  190. package/lib/types/host/hermes-adapter.js.map +1 -0
  191. package/lib/types/host/hermes-env.d.ts +4 -0
  192. package/lib/types/host/hermes-env.js +22 -0
  193. package/lib/types/host/hermes-env.js.map +1 -0
  194. package/lib/types/host/hermes-installation.d.ts +10 -0
  195. package/lib/types/host/hermes-installation.js +181 -0
  196. package/lib/types/host/hermes-installation.js.map +1 -0
  197. package/lib/types/host/hermes-models.d.ts +26 -0
  198. package/lib/types/host/hermes-models.js +328 -0
  199. package/lib/types/host/hermes-models.js.map +1 -0
  200. package/lib/types/host/hermes-native-entry.py +96 -0
  201. package/lib/types/host/hermes-nous-refresh.py +331 -0
  202. package/lib/types/host/hermes-nous.d.ts +53 -0
  203. package/lib/types/host/hermes-nous.js +343 -0
  204. package/lib/types/host/hermes-nous.js.map +1 -0
  205. package/lib/types/host/hermes-renewal.d.ts +27 -0
  206. package/lib/types/host/hermes-renewal.js +292 -0
  207. package/lib/types/host/hermes-renewal.js.map +1 -0
  208. package/lib/types/host/hermes-suppression.d.ts +7 -0
  209. package/lib/types/host/hermes-suppression.js +69 -0
  210. package/lib/types/host/hermes-suppression.js.map +1 -0
  211. package/lib/types/host/hermes-windows-installation.d.ts +5 -0
  212. package/lib/types/host/hermes-windows-installation.js +91 -0
  213. package/lib/types/host/hermes-windows-installation.js.map +1 -0
  214. package/lib/types/host/index.d.ts +140 -0
  215. package/lib/types/host/index.js +947 -0
  216. package/lib/types/host/index.js.map +1 -0
  217. package/lib/types/host/kimi-accounts.d.ts +17 -0
  218. package/lib/types/host/kimi-accounts.js +220 -0
  219. package/lib/types/host/kimi-accounts.js.map +1 -0
  220. package/lib/types/host/kimi-oauth-models.d.ts +14 -0
  221. package/lib/types/host/kimi-oauth-models.js +246 -0
  222. package/lib/types/host/kimi-oauth-models.js.map +1 -0
  223. package/lib/types/host/managed-agent.d.ts +4 -0
  224. package/lib/types/host/managed-agent.js +127 -0
  225. package/lib/types/host/managed-agent.js.map +1 -0
  226. package/lib/types/host/mimo-configuration.d.ts +22 -0
  227. package/lib/types/host/mimo-configuration.js +258 -0
  228. package/lib/types/host/mimo-configuration.js.map +1 -0
  229. package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
  230. package/lib/types/host/mimo-metadata-cache.js +121 -0
  231. package/lib/types/host/mimo-metadata-cache.js.map +1 -0
  232. package/lib/types/host/native-capability-cache.d.ts +11 -0
  233. package/lib/types/host/native-capability-cache.js +94 -0
  234. package/lib/types/host/native-capability-cache.js.map +1 -0
  235. package/lib/types/host/native-launch.d.mts +2 -0
  236. package/lib/types/host/native-launch.mjs +234 -0
  237. package/lib/types/host/native-process.d.ts +5 -0
  238. package/lib/types/host/native-process.js +41 -0
  239. package/lib/types/host/native-process.js.map +1 -0
  240. package/lib/types/host/native-spawn.mjs +32 -0
  241. package/lib/types/host/opencode-adapter.d.ts +94 -0
  242. package/lib/types/host/opencode-adapter.js +507 -0
  243. package/lib/types/host/opencode-adapter.js.map +1 -0
  244. package/lib/types/host/opencode-native.d.ts +27 -0
  245. package/lib/types/host/opencode-native.js +403 -0
  246. package/lib/types/host/opencode-native.js.map +1 -0
  247. package/lib/types/host/own-account-lease.d.mts +5 -0
  248. package/lib/types/host/own-account-lease.mjs +105 -0
  249. package/lib/types/host/pi-installation.d.mts +7 -0
  250. package/lib/types/host/pi-installation.mjs +87 -0
  251. package/lib/types/host/pi-omp-accounts.d.ts +28 -0
  252. package/lib/types/host/pi-omp-accounts.js +175 -0
  253. package/lib/types/host/pi-omp-accounts.js.map +1 -0
  254. package/lib/types/host/pi-omp-adapter.d.ts +32 -0
  255. package/lib/types/host/pi-omp-adapter.js +190 -0
  256. package/lib/types/host/pi-omp-adapter.js.map +1 -0
  257. package/lib/types/host/pi-omp-environment.d.mts +1 -0
  258. package/lib/types/host/pi-omp-environment.mjs +15 -0
  259. package/lib/types/host/pi-omp-identity.d.ts +2 -0
  260. package/lib/types/host/pi-omp-identity.js +142 -0
  261. package/lib/types/host/pi-omp-identity.js.map +1 -0
  262. package/lib/types/host/pi-omp-logout.d.ts +3 -0
  263. package/lib/types/host/pi-omp-logout.js +152 -0
  264. package/lib/types/host/pi-omp-logout.js.map +1 -0
  265. package/lib/types/host/pi-omp-native.d.ts +71 -0
  266. package/lib/types/host/pi-omp-native.js +753 -0
  267. package/lib/types/host/pi-omp-native.js.map +1 -0
  268. package/lib/types/host/pi-omp-refresh.d.mts +7 -0
  269. package/lib/types/host/pi-omp-refresh.mjs +324 -0
  270. package/lib/types/host/private-launch.mjs +23 -0
  271. package/lib/types/host/process.d.ts +43 -0
  272. package/lib/types/host/process.js +134 -0
  273. package/lib/types/host/process.js.map +1 -0
  274. package/lib/types/host/protocol.d.ts +23 -0
  275. package/lib/types/host/protocol.js +112 -0
  276. package/lib/types/host/protocol.js.map +1 -0
  277. package/lib/types/host/roles.d.ts +34 -0
  278. package/lib/types/host/roles.js +80 -0
  279. package/lib/types/host/roles.js.map +1 -0
  280. package/lib/types/host/routing.d.ts +31 -0
  281. package/lib/types/host/routing.js +248 -0
  282. package/lib/types/host/routing.js.map +1 -0
  283. package/lib/types/host/runtime.d.ts +60 -0
  284. package/lib/types/host/runtime.js +598 -0
  285. package/lib/types/host/runtime.js.map +1 -0
  286. package/lib/types/host/storage.d.ts +48 -0
  287. package/lib/types/host/storage.js +449 -0
  288. package/lib/types/host/storage.js.map +1 -0
  289. package/lib/types/host/telemetry.d.ts +17 -0
  290. package/lib/types/host/telemetry.js +158 -0
  291. package/lib/types/host/telemetry.js.map +1 -0
  292. package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
  293. package/lib/types/host/windows-account-launch.mjs +47 -0
  294. package/lib/types/host/windows-account-owner.ps1 +137 -0
  295. package/lib/types/host/windows-account-stdio.mjs +19 -0
  296. package/lib/types/host/windows-account-terminal.d.ts +17 -0
  297. package/lib/types/host/windows-account-terminal.js +208 -0
  298. package/lib/types/host/windows-account-terminal.js.map +1 -0
  299. package/lib/types/host/windows-agy-account.ps1 +81 -0
  300. package/lib/types/host/windows-cli-installation.d.ts +31 -0
  301. package/lib/types/host/windows-cli-installation.js +157 -0
  302. package/lib/types/host/windows-cli-installation.js.map +1 -0
  303. package/lib/types/host/windows-hidden-launch.mjs +49 -0
  304. package/lib/types/host/windows-hidden-process.d.ts +12 -0
  305. package/lib/types/host/windows-hidden-process.js +116 -0
  306. package/lib/types/host/windows-hidden-process.js.map +1 -0
  307. package/lib/types/host/zcode-account-models.d.ts +16 -0
  308. package/lib/types/host/zcode-account-models.js +114 -0
  309. package/lib/types/host/zcode-account-models.js.map +1 -0
  310. package/lib/types/host/zcode-adapter.d.ts +93 -0
  311. package/lib/types/host/zcode-adapter.js +808 -0
  312. package/lib/types/host/zcode-adapter.js.map +1 -0
  313. package/lib/types/host/zcode-grok-accounts.d.ts +30 -0
  314. package/lib/types/host/zcode-grok-accounts.js +408 -0
  315. package/lib/types/host/zcode-grok-accounts.js.map +1 -0
  316. package/lib/types/shared/accounts.d.ts +47 -0
  317. package/lib/types/shared/accounts.js +2 -0
  318. package/lib/types/shared/accounts.js.map +1 -0
  319. package/lib/types/shared/builtin-presets.d.ts +2 -0
  320. package/lib/types/shared/builtin-presets.js +231 -0
  321. package/lib/types/shared/builtin-presets.js.map +1 -0
  322. package/lib/types/shared/cli-settings.d.ts +5 -0
  323. package/lib/types/shared/cli-settings.js +2 -0
  324. package/lib/types/shared/cli-settings.js.map +1 -0
  325. package/lib/types/shared/model-presentation.d.ts +10 -0
  326. package/lib/types/shared/model-presentation.js +95 -0
  327. package/lib/types/shared/model-presentation.js.map +1 -0
  328. package/lib/types/shared/models.d.ts +7 -0
  329. package/lib/types/shared/models.js +35 -0
  330. package/lib/types/shared/models.js.map +1 -0
  331. package/lib/types/shared/telemetry.d.ts +18 -0
  332. package/lib/types/shared/telemetry.js +16 -0
  333. package/lib/types/shared/telemetry.js.map +1 -0
  334. package/lib/types/shared/types.d.ts +127 -0
  335. package/lib/types/shared/types.js +147 -0
  336. package/lib/types/shared/types.js.map +1 -0
  337. package/lib/windows-account-bootstrap.ps1 +44 -0
  338. package/lib/windows-account-launch.mjs +47 -0
  339. package/lib/windows-account-owner.ps1 +137 -0
  340. package/lib/windows-account-stdio.mjs +19 -0
  341. package/lib/windows-agy-account.ps1 +81 -0
  342. package/lib/windows-hidden-launch.mjs +49 -0
  343. package/lib/zcode-resume.mjs +423 -0
  344. package/package.json +109 -4
@@ -0,0 +1,126 @@
1
+ import { lstat, open } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { safePiOmpAncestors } from "./pi-omp-native.js";
6
+ const LIMIT = 64 * 1024;
7
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
8
+ const credentialPresent = (value) => typeof value === 'string' && value.trim().length > 0;
9
+ /** Only email is allowlisted. Reject controls/markup/credential-shaped strings outright. */
10
+ export function accountEmail(value) {
11
+ if (typeof value !== 'string' || value.length > 254)
12
+ return undefined;
13
+ if (/\p{C}|[<>]|\b(?:Bearer|sk-|sk_|ghp_|ya29\.)/iu.test(value))
14
+ return undefined;
15
+ const email = value.trim();
16
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/u.test(email) ? email : undefined;
17
+ }
18
+ function idTokenClaims(value) {
19
+ if (typeof value !== 'string' || value.length > 32 * 1024)
20
+ return undefined;
21
+ const pieces = value.split('.');
22
+ if (pieces.length !== 3 || !pieces.every((piece) => /^[A-Za-z0-9_-]+$/.test(piece)))
23
+ return undefined;
24
+ try {
25
+ const claims = JSON.parse(Buffer.from(pieces[1], 'base64url').toString('utf8'));
26
+ return record(claims) ? claims : undefined;
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ }
32
+ /** Local expiry is negative evidence only; an unsigned claim never proves login. */
33
+ export function localTokenExpired(value, now = Date.now()) {
34
+ const expiry = idTokenClaims(value)?.exp;
35
+ return typeof expiry === 'number' && Number.isFinite(expiry) && expiry * 1000 <= now;
36
+ }
37
+ /**
38
+ * This format/path is verified from the installed AGY CLI. Reading is
39
+ * bounded and ephemeral. No credential leaves this function; ID tokens are decoded
40
+ * only for a display email, never treated as a remotely verified assertion.
41
+ */
42
+ export function localAccountIdentity(options = {}) {
43
+ return async (cli, signal) => {
44
+ if (cli !== 'antigravity')
45
+ return undefined;
46
+ const home = options.home ?? homedir();
47
+ const path = join(home, '.gemini', 'jetski-standalone-oauth-token');
48
+ let handle;
49
+ let buffer;
50
+ try {
51
+ signal.throwIfAborted();
52
+ await safePiOmpAncestors(dirname(path));
53
+ const entry = await lstat(path);
54
+ if (entry.isSymbolicLink() || !entry.isFile() || entry.nlink !== 1)
55
+ throw new Error('Invalid account metadata');
56
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
57
+ const stat = await handle.stat();
58
+ if (!stat.isFile() ||
59
+ stat.nlink !== 1 ||
60
+ stat.dev !== entry.dev ||
61
+ stat.ino !== entry.ino ||
62
+ stat.size > LIMIT)
63
+ throw new Error('Invalid account metadata');
64
+ buffer = Buffer.alloc(LIMIT + 1);
65
+ let offset = 0;
66
+ while (offset <= LIMIT) {
67
+ signal.throwIfAborted();
68
+ const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, null);
69
+ if (!bytesRead)
70
+ break;
71
+ offset += bytesRead;
72
+ }
73
+ if (offset > LIMIT)
74
+ throw new Error('Invalid account metadata');
75
+ const after = await handle.stat();
76
+ const current = await lstat(path);
77
+ if (current.isSymbolicLink() ||
78
+ current.dev !== stat.dev ||
79
+ current.ino !== stat.ino ||
80
+ current.nlink !== 1 ||
81
+ offset !== stat.size ||
82
+ after.size !== stat.size ||
83
+ after.mtimeMs !== stat.mtimeMs ||
84
+ current.size !== after.size ||
85
+ current.mtimeMs !== after.mtimeMs)
86
+ throw new Error('Account metadata changed during read');
87
+ const value = JSON.parse(buffer.subarray(0, offset).toString('utf8'));
88
+ signal.throwIfAborted();
89
+ if (!record(value))
90
+ throw new Error('Invalid account metadata');
91
+ if (value.auth_method !== 'consumer' || !record(value.token))
92
+ return {
93
+ state: 'unknown',
94
+ verification: 'local',
95
+ summary: '登录格式未知,请打开账号终端',
96
+ };
97
+ const refreshable = credentialPresent(value.token.refresh_token);
98
+ const expiry = typeof value.token.expiry === 'string' ? Date.parse(value.token.expiry) : NaN;
99
+ const active = credentialPresent(value.token.access_token) && Number.isFinite(expiry) && expiry > Date.now();
100
+ if (!refreshable && !active)
101
+ return { state: 'unauthenticated', verification: 'local', summary: '本地登录已过期,请重新登录' };
102
+ return {
103
+ state: 'authenticated',
104
+ authMethod: 'oauth',
105
+ verification: 'local',
106
+ accountLabel: accountEmail(idTokenClaims(value.id_token)?.email),
107
+ summary: '已登录 Antigravity',
108
+ };
109
+ }
110
+ catch (error) {
111
+ signal.throwIfAborted();
112
+ if (error?.code === 'ENOENT')
113
+ return { state: 'unconfigured', verification: 'local', summary: '尚未登录 Antigravity' };
114
+ return {
115
+ state: 'unavailable',
116
+ verification: 'local',
117
+ summary: '登录状态读取失败,请重试',
118
+ };
119
+ }
120
+ finally {
121
+ buffer?.fill(0);
122
+ await handle?.close().catch(() => undefined);
123
+ }
124
+ };
125
+ }
126
+ //# sourceMappingURL=account-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-identity.js","sourceRoot":"","sources":["../../../src/host/account-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAQvD,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAA;AACvB,MAAM,MAAM,GAAG,CAAC,KAAc,EAAoC,EAAE,CAClE,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC/D,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;AAElG,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAA;IACrE,IAAI,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACjF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACrG,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QACzF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAChE,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,CAAA;IACxC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,IAAI,IAAI,GAAG,CAAA;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAEI,EAAE;IAEN,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC3B,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,SAAS,CAAA;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,+BAA+B,CAAC,CAAA;QACnE,IAAI,MAAM,CAAA;QACV,IAAI,MAA0B,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,CAAA;YACvB,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YACvC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC7C,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;YAC3F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAChC,IACE,CAAC,IAAI,CAAC,MAAM,EAAE;gBACd,IAAI,CAAC,KAAK,KAAK,CAAC;gBAChB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;gBACtB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;gBACtB,IAAI,CAAC,IAAI,GAAG,KAAK;gBAEjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC7C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YAChC,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,OAAO,MAAM,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,CAAC,cAAc,EAAE,CAAA;gBACvB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAA;gBACrF,IAAI,CAAC,SAAS;oBAAE,MAAK;gBACrB,MAAM,IAAI,SAAS,CAAA;YACrB,CAAC;YACD,IAAI,MAAM,GAAG,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC/D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YACjC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,IACE,OAAO,CAAC,cAAc,EAAE;gBACxB,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;gBACxB,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;gBACxB,OAAO,CAAC,KAAK,KAAK,CAAC;gBACnB,MAAM,KAAK,IAAI,CAAC,IAAI;gBACpB,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gBACxB,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;gBAC9B,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAC3B,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;gBAEjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;YACzD,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;YAC9E,MAAM,CAAC,cAAc,EAAE,CAAA;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC/D,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC1D,OAAO;oBACL,KAAK,EAAE,SAAS;oBAChB,YAAY,EAAE,OAAO;oBACrB,OAAO,EAAE,gBAAgB;iBAC1B,CAAA;YACH,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YAChE,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAC5F,MAAM,MAAM,GACV,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC/F,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM;gBACzB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;YACtF,OAAO;gBACL,KAAK,EAAE,eAAe;gBACtB,UAAU,EAAE,OAAO;gBACnB,YAAY,EAAE,OAAO;gBACrB,YAAY,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;gBAChE,OAAO,EAAE,iBAAiB;aAC3B,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,cAAc,EAAE,CAAA;YACvB,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBACrD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAA;YACtF,OAAO;gBACL,KAAK,EAAE,aAAa;gBACpB,YAAY,EAAE,OAAO;gBACrB,OAAO,EAAE,cAAc;aACxB,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AccountLogin } from '../shared/accounts.ts';
2
+ import type { AccountIdentity } from './account-identity.ts';
3
+ /** Display metadata only; the caller must establish current own credential evidence. */
4
+ export declare function providerLogin(provider: string, authMethod: AccountLogin['authMethod'], details?: {
5
+ baseUrl?: unknown;
6
+ name?: unknown;
7
+ }): AccountLogin;
8
+ /** Explicit native API values, excluding placeholders and unevaluated references. */
9
+ export declare function usableNativeApiKey(value: unknown): value is string;
10
+ export declare function authenticatedAccountLogins(input: AccountLogin[]): AccountIdentity;
@@ -0,0 +1,126 @@
1
+ const providerNames = {
2
+ openai: 'OpenAI',
3
+ 'openai-codex': 'OpenAI',
4
+ 'openai-codex-responses': 'OpenAI',
5
+ anthropic: 'Anthropic',
6
+ google: 'Google',
7
+ 'google-gemini-cli': 'Google',
8
+ 'google-antigravity': 'Google',
9
+ 'github-copilot': 'GitHub Copilot',
10
+ xai: 'xAI',
11
+ groq: 'Groq',
12
+ openrouter: 'OpenRouter',
13
+ mistral: 'Mistral',
14
+ cerebras: 'Cerebras',
15
+ deepseek: 'DeepSeek',
16
+ zai: 'Z.AI',
17
+ 'zai-coding-plan': 'Z.AI',
18
+ zhipu: '智谱',
19
+ zhipuai: '智谱',
20
+ 'zai-coding-cn': 'zai.cn',
21
+ 'zhipu-coding-plan': 'zai.cn',
22
+ 'zhipuai-coding-plan': 'zai.cn',
23
+ minimax: 'MiniMax',
24
+ 'minimax-cn': 'MiniMax',
25
+ 'minimax-coding-plan': 'MiniMax',
26
+ 'minimax-cn-coding-plan': 'MiniMax',
27
+ kimi: 'Kimi',
28
+ 'kimi-code': 'Kimi',
29
+ 'kimi-coding': 'Kimi',
30
+ moonshot: 'Moonshot',
31
+ nous: 'Nous',
32
+ 'nous-research': 'Nous',
33
+ opencode: 'OpenCode Zen',
34
+ 'opencode-go': 'OpenCode Go',
35
+ qwen: 'Qwen',
36
+ 'qwen-portal': 'Qwen',
37
+ };
38
+ const credentialShape = /\b(?:Bearer|sk[-_]|gh[pousr]_|ya29\.|eyJ)|(?:api[-_ ]?key|secret|token)/iu;
39
+ function safeName(value) {
40
+ if (typeof value !== 'string')
41
+ return undefined;
42
+ const name = value.trim();
43
+ if (!name ||
44
+ name.length > 48 ||
45
+ credentialShape.test(name) ||
46
+ !/^[\p{L}\p{N}][\p{L}\p{N} ._-]*$/u.test(name) ||
47
+ /[A-Za-z0-9_]{25,}/u.test(name))
48
+ return undefined;
49
+ return name;
50
+ }
51
+ function endpoint(value) {
52
+ if (typeof value !== 'string')
53
+ return undefined;
54
+ try {
55
+ const url = new URL(value);
56
+ return ['http:', 'https:'].includes(url.protocol) ? url : undefined;
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ function endpointName(url) {
63
+ if (!url)
64
+ return undefined;
65
+ const names = {
66
+ 'api.openai.com': 'OpenAI',
67
+ 'api.anthropic.com': 'Anthropic',
68
+ 'generativelanguage.googleapis.com': 'Google',
69
+ 'api.x.ai': 'xAI',
70
+ 'api.z.ai': 'Z.AI',
71
+ 'openrouter.ai': 'OpenRouter',
72
+ 'api.deepseek.com': 'DeepSeek',
73
+ 'api.minimax.io': 'MiniMax',
74
+ 'api.minimaxi.com': 'MiniMax',
75
+ 'api.moonshot.ai': 'Moonshot',
76
+ 'api.moonshot.cn': 'Moonshot',
77
+ };
78
+ if (url.protocol === 'https:' && !url.port && !url.username && !url.password) {
79
+ if (url.hostname === 'open.bigmodel.cn')
80
+ return url.pathname.startsWith('/api/coding/') ? 'zai.cn' : '智谱';
81
+ if (Object.hasOwn(names, url.hostname))
82
+ return names[url.hostname];
83
+ }
84
+ // Only the host is displayable: never userinfo, port, path, query or fragment.
85
+ return safeName(url.hostname);
86
+ }
87
+ /** Display metadata only; the caller must establish current own credential evidence. */
88
+ export function providerLogin(provider, authMethod, details = {}) {
89
+ const url = endpoint(details.baseUrl);
90
+ const known = Object.hasOwn(providerNames, provider) ? providerNames[provider] : undefined;
91
+ const providerLabel = (authMethod === 'api'
92
+ ? endpointName(url) || known || safeName(details.name) || safeName(provider)
93
+ : known || safeName(details.name) || safeName(provider) || endpointName(url)) || '自定义服务商';
94
+ return { providerLabel, authMethod };
95
+ }
96
+ /** Explicit native API values, excluding placeholders and unevaluated references. */
97
+ export function usableNativeApiKey(value) {
98
+ if (typeof value !== 'string' || !value.trim())
99
+ return false;
100
+ const key = value.trim();
101
+ return (!/[\s\p{C}<>]/u.test(key) &&
102
+ !key.startsWith('!') &&
103
+ !/\$\{|\{(?:env|file):|^\$[A-Z_]|^(?:your(?:[-_].*)?|replace[-_]?me|change[-_]?me|placeholder|example[-_]?key|sk[-_](?:x{3,}|\.\.\.))$/iu.test(key));
104
+ }
105
+ export function authenticatedAccountLogins(input) {
106
+ const seen = new Set();
107
+ const logins = input.filter((login) => {
108
+ const key = JSON.stringify([login.providerLabel, login.authMethod, login.accountLabel]);
109
+ if (seen.has(key))
110
+ return false;
111
+ seen.add(key);
112
+ return true;
113
+ });
114
+ if (!logins.length)
115
+ throw new Error('Missing native account login evidence');
116
+ const methods = new Set(logins.map((login) => login.authMethod));
117
+ const authMethod = methods.size === 1 ? logins[0].authMethod : undefined;
118
+ return {
119
+ state: 'authenticated',
120
+ verification: 'local',
121
+ logins,
122
+ ...(authMethod ? { authMethod } : {}),
123
+ summary: authMethod === 'api' ? 'API 登录' : '已登录',
124
+ };
125
+ }
126
+ //# sourceMappingURL=account-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-login.js","sourceRoot":"","sources":["../../../src/host/account-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface AccountModelScope {
2
+ state: 'supported' | 'denied' | 'unknown'
3
+ source: 'account-models' | 'configured-custom' | 'verified-route' | 'unknown'
4
+ /** Safe metadata classification; absent when the server did not establish a specific cause. */
5
+ denialReason?: 'authentication' | 'quota'
6
+ models: { id: string; name?: string; cost: 'free' | 'paid' | 'unknown' }[]
7
+ }
8
+ export interface AccountModelInput {
9
+ provider: string
10
+ credential: { type: 'api' | 'oauth'; key?: string; access?: string; expires?: number; accountId?: string }
11
+ baseUrl?: string
12
+ apiType?: string
13
+ /** Mirror a native route that explicitly sends both Anthropic auth headers. */
14
+ anthropicAuth?: 'api-key-and-bearer' | 'bearer'
15
+ customModelIds?: string[]
16
+ verifiedModelIds?: string[]
17
+ }
18
+ export function probeAccountModels(
19
+ input: AccountModelInput,
20
+ options?: { signal?: AbortSignal; fetch?: typeof fetch; timeoutMs?: number },
21
+ ): Promise<AccountModelScope>
@@ -0,0 +1,262 @@
1
+ // Read-only account metadata. Never refresh OAuth, submit prompts, or return
2
+ // credentials, account IDs, headers, endpoint URLs, or raw exception messages.
3
+ const unknown = () => ({ state: 'unknown', source: 'unknown', models: [] })
4
+ const denied = (denialReason) => ({
5
+ state: 'denied',
6
+ source: 'unknown',
7
+ models: [],
8
+ ...(denialReason ? { denialReason } : {}),
9
+ })
10
+ const validId = (id) => typeof id === 'string' && !!id && id.length <= 1024 && !/[\s\x00-\x1f]/.test(id)
11
+ const object = (value) => value && typeof value === 'object' && !Array.isArray(value)
12
+ const unavailable = (model) =>
13
+ model.supported_in_api === false ||
14
+ model.allowed === false ||
15
+ model.available === false ||
16
+ model.entitled === false ||
17
+ model.enabled === false ||
18
+ model.disabled === true ||
19
+ model.upgrade_required === true ||
20
+ model.visibility === 'hidden' ||
21
+ model.visibility === 'none'
22
+ const numericRate = (value) =>
23
+ typeof value === 'number'
24
+ ? value
25
+ : typeof value === 'string' &&
26
+ value.trim() &&
27
+ /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/.test(value.trim())
28
+ ? Number(value)
29
+ : NaN
30
+ const costFor = (model, oauth) => {
31
+ if (oauth) return 'unknown'
32
+ const rates = model.pricing
33
+ if (object(rates)) {
34
+ const input = numericRate(Object.hasOwn(rates, 'input') ? rates.input : rates.prompt),
35
+ output = numericRate(Object.hasOwn(rates, 'output') ? rates.output : rates.completion)
36
+ if (Number.isFinite(input) && Number.isFinite(output) && input >= 0 && output >= 0) {
37
+ const additional = Object.entries(rates)
38
+ .filter(([key]) => !['input', 'output', 'prompt', 'completion', 'free'].includes(key))
39
+ .map(([, value]) => numericRate(value))
40
+ if (input > 0 || output > 0 || additional.some((value) => value > 0)) return 'paid'
41
+ if (additional.some((value) => !Number.isFinite(value) || value < 0)) return 'unknown'
42
+ return 'free'
43
+ }
44
+ // Explicit invalid rates cannot be overridden by a contradictory free flag.
45
+ if ('input' in rates || 'prompt' in rates || 'output' in rates || 'completion' in rates) return 'unknown'
46
+ }
47
+ return model.free === true || model.is_free === true || model.pricing?.free === true ? 'free' : 'unknown'
48
+ }
49
+ function entries(payload) {
50
+ if (Array.isArray(payload)) return payload
51
+ if (!object(payload)) return undefined
52
+ return Array.isArray(payload.models)
53
+ ? payload.models
54
+ : Array.isArray(payload.data)
55
+ ? payload.data
56
+ : undefined
57
+ }
58
+ function normalize(payload, oauth, token) {
59
+ const list = entries(payload)
60
+ if (!list) return undefined
61
+ const result = new Map()
62
+ for (const model of list) {
63
+ if (!object(model) || unavailable(model)) continue
64
+ const id = model.slug ?? model.id
65
+ if (
66
+ !validId(id) ||
67
+ id === token ||
68
+ (token.length >= 12 && id.includes(token)) ||
69
+ (oauth && model.supported_in_api !== true)
70
+ )
71
+ continue
72
+ const name = model.display_name ?? model.name
73
+ result.set(id, {
74
+ id,
75
+ ...(typeof name === 'string' &&
76
+ name.trim() &&
77
+ name.length <= 4096 &&
78
+ name !== token &&
79
+ !(token.length >= 12 && name.includes(token))
80
+ ? { name }
81
+ : {}),
82
+ cost: costFor(model, oauth),
83
+ })
84
+ }
85
+ return [...result.values()]
86
+ }
87
+ function metadataBase(input, codex) {
88
+ const url = new URL(codex ? 'https://chatgpt.com/backend-api' : input.baseUrl)
89
+ if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
90
+ throw new Error('Unsafe metadata endpoint')
91
+ const base = url.toString().replace(/\/+$/, '')
92
+ return input.apiType === 'anthropic-messages' && !/\/v1$/.test(url.pathname.replace(/\/+$/, ''))
93
+ ? `${base}/v1`
94
+ : base
95
+ }
96
+ async function readResponse(response) {
97
+ if (!response.body) return undefined
98
+ const reader = response.body.getReader()
99
+ let length = 0
100
+ const chunks = []
101
+ try {
102
+ while (true) {
103
+ const { done, value } = await reader.read()
104
+ if (done) break
105
+ length += value.length
106
+ if (length > 2 * 1024 * 1024) {
107
+ await reader.cancel()
108
+ return undefined
109
+ }
110
+ chunks.push(value)
111
+ }
112
+ const bytes = new Uint8Array(length)
113
+ let offset = 0
114
+ for (const chunk of chunks) {
115
+ bytes.set(chunk, offset)
116
+ offset += chunk.length
117
+ }
118
+ return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes))
119
+ } finally {
120
+ reader.releaseLock()
121
+ }
122
+ }
123
+ /** Exact current-account model scope, or a narrowly declared API fallback. */
124
+ export async function probeAccountModels(input, options = {}) {
125
+ const credential = input.credential
126
+ if (!credential || !['api', 'oauth'].includes(credential.type)) return unknown()
127
+ const oauth = credential.type === 'oauth'
128
+ const token = oauth ? credential.access : credential.key
129
+ if (typeof token !== 'string' || !token.trim() || token.trimStart().startsWith('!')) return unknown()
130
+ // Near-expiry credentials cannot reliably finish the query. Do not renew them.
131
+ if (oauth && (typeof credential.expires !== 'number' || credential.expires <= Date.now() + 30000))
132
+ return denied('authentication')
133
+ const codex = oauth && ['openai', 'openai-codex'].includes(input.provider)
134
+ // xAI/other subscription catalogs do not expose a verified per-account scope
135
+ // contract here. Do not turn an OAuth login into their whole public catalog.
136
+ if (oauth && !codex) return unknown()
137
+ const parent = options.signal
138
+ if (parent?.aborted) return unknown()
139
+ const controller = new AbortController()
140
+ const signal = parent ? AbortSignal.any([parent, controller.signal]) : controller.signal
141
+ const timer = setTimeout(() => controller.abort(), Math.max(50, Math.min(options.timeoutMs ?? 8000, 10000)))
142
+ try {
143
+ if (codex && input.baseUrl && input.baseUrl.replace(/\/+$/, '') !== 'https://chatgpt.com/backend-api')
144
+ return unknown()
145
+ const base = metadataBase(input, codex)
146
+ const headers = { accept: 'application/json', Authorization: `Bearer ${token}` }
147
+ if (input.apiType === 'anthropic-messages' && !oauth) {
148
+ // ZCode's native Anthropic factory sends both headers. Other callers keep
149
+ // the ordinary x-api-key contract unless they explicitly mirror that route.
150
+ if (!['api-key-and-bearer', 'bearer'].includes(input.anthropicAuth)) delete headers.Authorization
151
+ if (input.anthropicAuth !== 'bearer') headers['x-api-key'] = token
152
+ headers['anthropic-version'] = '2023-06-01'
153
+ }
154
+ if (codex) {
155
+ let accountId = credential.accountId
156
+ if (!accountId) {
157
+ try {
158
+ accountId = JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString('utf8'))?.[
159
+ 'https://api.openai.com/auth'
160
+ ]?.chatgpt_account_id
161
+ } catch {}
162
+ }
163
+ if (typeof accountId === 'string' && accountId) headers['chatgpt-account-id'] = accountId
164
+ headers['OpenAI-Beta'] = 'responses=experimental'
165
+ headers.originator = 'pi'
166
+ headers.version = '0.144.1'
167
+ }
168
+ const fetcher = options.fetch ?? globalThis.fetch
169
+ const request = async (path) => {
170
+ const target = `${base}${path}${codex && path !== '/wham/usage' ? '?client_version=0.144.1' : ''}`
171
+ const response = await fetcher(target, { method: 'GET', headers, signal, redirect: 'error' })
172
+ if (!response.ok) {
173
+ await response.body?.cancel()
174
+ return { status: response.status, payload: undefined }
175
+ }
176
+ return { status: response.status, payload: await readResponse(response) }
177
+ }
178
+ let modelResponse
179
+ for (const path of codex
180
+ ? ['/codex/models', '/models']
181
+ : [
182
+ input.provider === 'openrouter' || new URL(base).hostname === 'openrouter.ai'
183
+ ? '/models/user'
184
+ : '/models',
185
+ ]) {
186
+ modelResponse = await request(path)
187
+ if (modelResponse.status === 401 || modelResponse.status === 403) return denied('authentication')
188
+ if (modelResponse.status >= 200 && modelResponse.status < 300) break
189
+ if (![404, 405].includes(modelResponse.status)) return unknown()
190
+ }
191
+ if (modelResponse?.status >= 200 && modelResponse.status < 300) {
192
+ const envelope = modelResponse.payload
193
+ if (envelope?.allowed === false || envelope?.authenticated === false) return denied()
194
+ if (envelope?.success === false || envelope?.error) {
195
+ const code = envelope?.error?.code
196
+ return ['invalid_api_key', 'authentication_failed', 'unauthorized', 'forbidden', 401, 403].includes(
197
+ code,
198
+ )
199
+ ? denied('authentication')
200
+ : unknown()
201
+ }
202
+ const models = normalize(envelope, oauth, token)
203
+ if (models === undefined) return unknown()
204
+ if (codex) {
205
+ const usage = await request('/wham/usage')
206
+ const rate = usage.payload?.rate_limit
207
+ if (usage.status === 401 || usage.status === 403) return denied('authentication')
208
+ // Only the authenticated usage response establishes exhausted quota.
209
+ // Keep an unclassified denial distinct from expiry/401/403 and network failure.
210
+ if (usage.status === 200 && rate?.limit_reached === true) return denied('quota')
211
+ if (rate?.allowed === false || rate?.limit_reached === true) return denied()
212
+ // A catalog/menu is not evidence that the account has an executable quota.
213
+ if (usage.status !== 200 || rate?.allowed !== true || rate?.limit_reached !== false) return unknown()
214
+ const plan =
215
+ typeof usage.payload?.plan_type === 'string'
216
+ ? usage.payload.plan_type
217
+ .trim()
218
+ .toLowerCase()
219
+ .replace(/^chatgpt_/, '')
220
+ : ''
221
+ const cost =
222
+ plan === 'free'
223
+ ? 'free'
224
+ : ['plus', 'pro', 'team', 'business', 'enterprise', 'edu', 'pro_lite', 'prolite'].includes(plan)
225
+ ? 'paid'
226
+ : 'unknown'
227
+ for (const model of models) model.cost = cost
228
+ }
229
+ if (
230
+ !oauth &&
231
+ ([
232
+ 'zai-coding-cn',
233
+ 'cliworker-zai-cn',
234
+ 'zhipu-coding-plan',
235
+ 'zhipuai-coding-plan',
236
+ 'kimi-coding',
237
+ ].includes(input.provider) ||
238
+ /open\.bigmodel\.cn\/api\/coding\//.test(base))
239
+ ) {
240
+ for (const model of models) if (model.cost === 'free') model.cost = 'unknown'
241
+ }
242
+ return { state: 'supported', source: 'account-models', models }
243
+ }
244
+ if (!oauth && [404, 405].includes(modelResponse?.status)) {
245
+ // Declaring a custom model is not an account entitlement proof.
246
+ const verified = [...new Set(input.verifiedModelIds ?? [])].filter(
247
+ (id) => validId(id) && id !== token && !(token.length >= 12 && id.includes(token)),
248
+ )
249
+ if (verified.length)
250
+ return {
251
+ state: 'supported',
252
+ source: 'verified-route',
253
+ models: verified.map((id) => ({ id, cost: 'unknown' })),
254
+ }
255
+ }
256
+ return unknown()
257
+ } catch {
258
+ return unknown()
259
+ } finally {
260
+ clearTimeout(timer)
261
+ }
262
+ }
@@ -0,0 +1,42 @@
1
+ import { type ProcessBackend, type RuntimeConfig } from './process.ts';
2
+ import { type CliId } from '../shared/types.ts';
3
+ import type { AccountAction, AccountFrame, AccountSource, AccountStatus, ZCodeLoginProvider } from '../shared/accounts.ts';
4
+ import { type AccountIdentitySource } from './account-identity.ts';
5
+ /** User-only auth processes. Only allowlisted identity metadata leaves the Host. */
6
+ export declare class AccountManager {
7
+ private backend;
8
+ private config;
9
+ private identity;
10
+ private readonly sessions;
11
+ private readonly reserved;
12
+ private readonly unsafeQueries;
13
+ private readonly unsafeTerminals;
14
+ private readonly statusQueries;
15
+ private readonly pending;
16
+ private readonly parents;
17
+ private readonly parentClosings;
18
+ private readonly controller;
19
+ private closing?;
20
+ constructor(backend: ProcessBackend, config: RuntimeConfig, identity?: AccountIdentitySource);
21
+ isBusy(cli: CliId): boolean;
22
+ status(cli: CliId, cwd: string, signal: AbortSignal): Promise<AccountStatus>;
23
+ private readStatus;
24
+ private hasCustomExecutable;
25
+ start(parent: string, cli: CliId, action: AccountAction, cwd: string, signal: AbortSignal, source?: AccountSource, provider?: ZCodeLoginProvider): Promise<{
26
+ id: string;
27
+ instruction: string;
28
+ }>;
29
+ private startSession;
30
+ private readTerminal;
31
+ private emit;
32
+ private owned;
33
+ watch(parent: string, id: string, signal: AbortSignal): AsyncIterable<AccountFrame>;
34
+ write(parent: string, id: string, data: string): Promise<void>;
35
+ resize(parent: string, id: string, cols: number, rows: number): Promise<void>;
36
+ stop(parent: string, id: string): Promise<void>;
37
+ /** Close one Agent lifetime, including startup; a later Agent with the same ID gets a fresh scope. */
38
+ closeParent(parent: string): Promise<void>;
39
+ private finish;
40
+ private track;
41
+ close(): Promise<void>;
42
+ }