codex-multi-auth 0.1.0

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 (327) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +162 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +87 -0
  6. package/config/minimal-opencode.json +13 -0
  7. package/config/opencode-legacy.json +571 -0
  8. package/config/opencode-modern.json +239 -0
  9. package/dist/index.d.ts +45 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +3160 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/accounts/rate-limits.d.ts +22 -0
  14. package/dist/lib/accounts/rate-limits.d.ts.map +1 -0
  15. package/dist/lib/accounts/rate-limits.js +63 -0
  16. package/dist/lib/accounts/rate-limits.js.map +1 -0
  17. package/dist/lib/accounts.d.ts +95 -0
  18. package/dist/lib/accounts.d.ts.map +1 -0
  19. package/dist/lib/accounts.js +668 -0
  20. package/dist/lib/accounts.js.map +1 -0
  21. package/dist/lib/audit.d.ts +45 -0
  22. package/dist/lib/audit.d.ts.map +1 -0
  23. package/dist/lib/audit.js +131 -0
  24. package/dist/lib/audit.js.map +1 -0
  25. package/dist/lib/auth/auth.d.ts +56 -0
  26. package/dist/lib/auth/auth.d.ts.map +1 -0
  27. package/dist/lib/auth/auth.js +214 -0
  28. package/dist/lib/auth/auth.js.map +1 -0
  29. package/dist/lib/auth/browser.d.ts +34 -0
  30. package/dist/lib/auth/browser.d.ts.map +1 -0
  31. package/dist/lib/auth/browser.js +185 -0
  32. package/dist/lib/auth/browser.js.map +1 -0
  33. package/dist/lib/auth/server.d.ts +24 -0
  34. package/dist/lib/auth/server.d.ts.map +1 -0
  35. package/dist/lib/auth/server.js +116 -0
  36. package/dist/lib/auth/server.js.map +1 -0
  37. package/dist/lib/auth/token-utils.d.ts +59 -0
  38. package/dist/lib/auth/token-utils.d.ts.map +1 -0
  39. package/dist/lib/auth/token-utils.js +331 -0
  40. package/dist/lib/auth/token-utils.js.map +1 -0
  41. package/dist/lib/auth-rate-limit.d.ts +20 -0
  42. package/dist/lib/auth-rate-limit.d.ts.map +1 -0
  43. package/dist/lib/auth-rate-limit.js +91 -0
  44. package/dist/lib/auth-rate-limit.js.map +1 -0
  45. package/dist/lib/auto-update-checker.d.ts +10 -0
  46. package/dist/lib/auto-update-checker.d.ts.map +1 -0
  47. package/dist/lib/auto-update-checker.js +216 -0
  48. package/dist/lib/auto-update-checker.js.map +1 -0
  49. package/dist/lib/capability-policy.d.ts +18 -0
  50. package/dist/lib/capability-policy.d.ts.map +1 -0
  51. package/dist/lib/capability-policy.js +150 -0
  52. package/dist/lib/capability-policy.js.map +1 -0
  53. package/dist/lib/circuit-breaker.d.ts +34 -0
  54. package/dist/lib/circuit-breaker.d.ts.map +1 -0
  55. package/dist/lib/circuit-breaker.js +124 -0
  56. package/dist/lib/circuit-breaker.js.map +1 -0
  57. package/dist/lib/cli.d.ts +64 -0
  58. package/dist/lib/cli.d.ts.map +1 -0
  59. package/dist/lib/cli.js +274 -0
  60. package/dist/lib/cli.js.map +1 -0
  61. package/dist/lib/codex-cli/observability.d.ts +22 -0
  62. package/dist/lib/codex-cli/observability.d.ts.map +1 -0
  63. package/dist/lib/codex-cli/observability.js +36 -0
  64. package/dist/lib/codex-cli/observability.js.map +1 -0
  65. package/dist/lib/codex-cli/state.d.ts +86 -0
  66. package/dist/lib/codex-cli/state.d.ts.map +1 -0
  67. package/dist/lib/codex-cli/state.js +470 -0
  68. package/dist/lib/codex-cli/state.js.map +1 -0
  69. package/dist/lib/codex-cli/sync.d.ts +27 -0
  70. package/dist/lib/codex-cli/sync.d.ts.map +1 -0
  71. package/dist/lib/codex-cli/sync.js +325 -0
  72. package/dist/lib/codex-cli/sync.js.map +1 -0
  73. package/dist/lib/codex-cli/writer.d.ts +12 -0
  74. package/dist/lib/codex-cli/writer.d.ts.map +1 -0
  75. package/dist/lib/codex-cli/writer.js +388 -0
  76. package/dist/lib/codex-cli/writer.js.map +1 -0
  77. package/dist/lib/codex-manager.d.ts +2 -0
  78. package/dist/lib/codex-manager.d.ts.map +1 -0
  79. package/dist/lib/codex-manager.js +4841 -0
  80. package/dist/lib/codex-manager.js.map +1 -0
  81. package/dist/lib/config.d.ts +269 -0
  82. package/dist/lib/config.d.ts.map +1 -0
  83. package/dist/lib/config.js +789 -0
  84. package/dist/lib/config.js.map +1 -0
  85. package/dist/lib/constants.d.ts +78 -0
  86. package/dist/lib/constants.d.ts.map +1 -0
  87. package/dist/lib/constants.js +78 -0
  88. package/dist/lib/constants.js.map +1 -0
  89. package/dist/lib/context-overflow.d.ts +27 -0
  90. package/dist/lib/context-overflow.d.ts.map +1 -0
  91. package/dist/lib/context-overflow.js +124 -0
  92. package/dist/lib/context-overflow.js.map +1 -0
  93. package/dist/lib/dashboard-settings.d.ts +90 -0
  94. package/dist/lib/dashboard-settings.d.ts.map +1 -0
  95. package/dist/lib/dashboard-settings.js +327 -0
  96. package/dist/lib/dashboard-settings.js.map +1 -0
  97. package/dist/lib/entitlement-cache.d.ts +41 -0
  98. package/dist/lib/entitlement-cache.d.ts.map +1 -0
  99. package/dist/lib/entitlement-cache.js +137 -0
  100. package/dist/lib/entitlement-cache.js.map +1 -0
  101. package/dist/lib/errors.d.ts +113 -0
  102. package/dist/lib/errors.d.ts.map +1 -0
  103. package/dist/lib/errors.js +103 -0
  104. package/dist/lib/errors.js.map +1 -0
  105. package/dist/lib/forecast.d.ts +42 -0
  106. package/dist/lib/forecast.d.ts.map +1 -0
  107. package/dist/lib/forecast.js +256 -0
  108. package/dist/lib/forecast.js.map +1 -0
  109. package/dist/lib/health.d.ts +33 -0
  110. package/dist/lib/health.d.ts.map +1 -0
  111. package/dist/lib/health.js +70 -0
  112. package/dist/lib/health.js.map +1 -0
  113. package/dist/lib/index.d.ts +32 -0
  114. package/dist/lib/index.d.ts.map +1 -0
  115. package/dist/lib/index.js +32 -0
  116. package/dist/lib/index.js.map +1 -0
  117. package/dist/lib/live-account-sync.d.ts +39 -0
  118. package/dist/lib/live-account-sync.d.ts.map +1 -0
  119. package/dist/lib/live-account-sync.js +196 -0
  120. package/dist/lib/live-account-sync.js.map +1 -0
  121. package/dist/lib/logger.d.ts +40 -0
  122. package/dist/lib/logger.d.ts.map +1 -0
  123. package/dist/lib/logger.js +364 -0
  124. package/dist/lib/logger.js.map +1 -0
  125. package/dist/lib/oauth-success.html +338 -0
  126. package/dist/lib/parallel-probe.d.ts +28 -0
  127. package/dist/lib/parallel-probe.d.ts.map +1 -0
  128. package/dist/lib/parallel-probe.js +97 -0
  129. package/dist/lib/parallel-probe.js.map +1 -0
  130. package/dist/lib/preemptive-quota-scheduler.d.ts +53 -0
  131. package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -0
  132. package/dist/lib/preemptive-quota-scheduler.js +220 -0
  133. package/dist/lib/preemptive-quota-scheduler.js.map +1 -0
  134. package/dist/lib/proactive-refresh.d.ts +66 -0
  135. package/dist/lib/proactive-refresh.d.ts.map +1 -0
  136. package/dist/lib/proactive-refresh.js +143 -0
  137. package/dist/lib/proactive-refresh.js.map +1 -0
  138. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  139. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  140. package/dist/lib/prompts/codex-opencode-bridge.js +169 -0
  141. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  142. package/dist/lib/prompts/codex.d.ts +41 -0
  143. package/dist/lib/prompts/codex.d.ts.map +1 -0
  144. package/dist/lib/prompts/codex.js +383 -0
  145. package/dist/lib/prompts/codex.js.map +1 -0
  146. package/dist/lib/prompts/opencode-codex.d.ts +25 -0
  147. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  148. package/dist/lib/prompts/opencode-codex.js +270 -0
  149. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  150. package/dist/lib/quota-cache.d.ts +68 -0
  151. package/dist/lib/quota-cache.d.ts.map +1 -0
  152. package/dist/lib/quota-cache.js +224 -0
  153. package/dist/lib/quota-cache.js.map +1 -0
  154. package/dist/lib/quota-probe.d.ts +49 -0
  155. package/dist/lib/quota-probe.d.ts.map +1 -0
  156. package/dist/lib/quota-probe.js +368 -0
  157. package/dist/lib/quota-probe.js.map +1 -0
  158. package/dist/lib/recovery/constants.d.ts +12 -0
  159. package/dist/lib/recovery/constants.d.ts.map +1 -0
  160. package/dist/lib/recovery/constants.js +31 -0
  161. package/dist/lib/recovery/constants.js.map +1 -0
  162. package/dist/lib/recovery/index.d.ts +12 -0
  163. package/dist/lib/recovery/index.d.ts.map +1 -0
  164. package/dist/lib/recovery/index.js +12 -0
  165. package/dist/lib/recovery/index.js.map +1 -0
  166. package/dist/lib/recovery/storage.d.ts +24 -0
  167. package/dist/lib/recovery/storage.d.ts.map +1 -0
  168. package/dist/lib/recovery/storage.js +362 -0
  169. package/dist/lib/recovery/storage.js.map +1 -0
  170. package/dist/lib/recovery/types.d.ts +116 -0
  171. package/dist/lib/recovery/types.d.ts.map +1 -0
  172. package/dist/lib/recovery/types.js +7 -0
  173. package/dist/lib/recovery/types.js.map +1 -0
  174. package/dist/lib/recovery.d.ts +31 -0
  175. package/dist/lib/recovery.d.ts.map +1 -0
  176. package/dist/lib/recovery.js +313 -0
  177. package/dist/lib/recovery.js.map +1 -0
  178. package/dist/lib/refresh-guardian.d.ts +31 -0
  179. package/dist/lib/refresh-guardian.d.ts.map +1 -0
  180. package/dist/lib/refresh-guardian.js +151 -0
  181. package/dist/lib/refresh-guardian.js.map +1 -0
  182. package/dist/lib/refresh-lease.d.ts +37 -0
  183. package/dist/lib/refresh-lease.d.ts.map +1 -0
  184. package/dist/lib/refresh-lease.js +335 -0
  185. package/dist/lib/refresh-lease.js.map +1 -0
  186. package/dist/lib/refresh-queue.d.ts +117 -0
  187. package/dist/lib/refresh-queue.d.ts.map +1 -0
  188. package/dist/lib/refresh-queue.js +297 -0
  189. package/dist/lib/refresh-queue.js.map +1 -0
  190. package/dist/lib/request/failure-policy.d.ts +42 -0
  191. package/dist/lib/request/failure-policy.d.ts.map +1 -0
  192. package/dist/lib/request/failure-policy.js +133 -0
  193. package/dist/lib/request/failure-policy.js.map +1 -0
  194. package/dist/lib/request/fetch-helpers.d.ts +152 -0
  195. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  196. package/dist/lib/request/fetch-helpers.js +704 -0
  197. package/dist/lib/request/fetch-helpers.js.map +1 -0
  198. package/dist/lib/request/helpers/input-utils.d.ts +7 -0
  199. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  200. package/dist/lib/request/helpers/input-utils.js +214 -0
  201. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  202. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  203. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  204. package/dist/lib/request/helpers/model-map.js +133 -0
  205. package/dist/lib/request/helpers/model-map.js.map +1 -0
  206. package/dist/lib/request/helpers/tool-utils.d.ts +29 -0
  207. package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -0
  208. package/dist/lib/request/helpers/tool-utils.js +117 -0
  209. package/dist/lib/request/helpers/tool-utils.js.map +1 -0
  210. package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
  211. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
  212. package/dist/lib/request/rate-limit-backoff.js +83 -0
  213. package/dist/lib/request/rate-limit-backoff.js.map +1 -0
  214. package/dist/lib/request/request-transformer.d.ts +107 -0
  215. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  216. package/dist/lib/request/request-transformer.js +814 -0
  217. package/dist/lib/request/request-transformer.js.map +1 -0
  218. package/dist/lib/request/response-handler.d.ts +23 -0
  219. package/dist/lib/request/response-handler.d.ts.map +1 -0
  220. package/dist/lib/request/response-handler.js +155 -0
  221. package/dist/lib/request/response-handler.js.map +1 -0
  222. package/dist/lib/request/stream-failover.d.ts +21 -0
  223. package/dist/lib/request/stream-failover.d.ts.map +1 -0
  224. package/dist/lib/request/stream-failover.js +204 -0
  225. package/dist/lib/request/stream-failover.js.map +1 -0
  226. package/dist/lib/rotation.d.ts +146 -0
  227. package/dist/lib/rotation.d.ts.map +1 -0
  228. package/dist/lib/rotation.js +321 -0
  229. package/dist/lib/rotation.js.map +1 -0
  230. package/dist/lib/runtime-paths.d.ts +58 -0
  231. package/dist/lib/runtime-paths.d.ts.map +1 -0
  232. package/dist/lib/runtime-paths.js +164 -0
  233. package/dist/lib/runtime-paths.js.map +1 -0
  234. package/dist/lib/schemas.d.ts +435 -0
  235. package/dist/lib/schemas.d.ts.map +1 -0
  236. package/dist/lib/schemas.js +268 -0
  237. package/dist/lib/schemas.js.map +1 -0
  238. package/dist/lib/session-affinity.d.ts +23 -0
  239. package/dist/lib/session-affinity.d.ts.map +1 -0
  240. package/dist/lib/session-affinity.js +127 -0
  241. package/dist/lib/session-affinity.js.map +1 -0
  242. package/dist/lib/shutdown.d.ts +7 -0
  243. package/dist/lib/shutdown.d.ts.map +1 -0
  244. package/dist/lib/shutdown.js +43 -0
  245. package/dist/lib/shutdown.js.map +1 -0
  246. package/dist/lib/storage/migrations.d.ts +59 -0
  247. package/dist/lib/storage/migrations.d.ts.map +1 -0
  248. package/dist/lib/storage/migrations.js +41 -0
  249. package/dist/lib/storage/migrations.js.map +1 -0
  250. package/dist/lib/storage/paths.d.ts +51 -0
  251. package/dist/lib/storage/paths.d.ts.map +1 -0
  252. package/dist/lib/storage/paths.js +152 -0
  253. package/dist/lib/storage/paths.js.map +1 -0
  254. package/dist/lib/storage.d.ts +106 -0
  255. package/dist/lib/storage.d.ts.map +1 -0
  256. package/dist/lib/storage.js +896 -0
  257. package/dist/lib/storage.js.map +1 -0
  258. package/dist/lib/table-formatter.d.ts +32 -0
  259. package/dist/lib/table-formatter.d.ts.map +1 -0
  260. package/dist/lib/table-formatter.js +44 -0
  261. package/dist/lib/table-formatter.js.map +1 -0
  262. package/dist/lib/tools/hashline-tools.d.ts +51 -0
  263. package/dist/lib/tools/hashline-tools.d.ts.map +1 -0
  264. package/dist/lib/tools/hashline-tools.js +456 -0
  265. package/dist/lib/tools/hashline-tools.js.map +1 -0
  266. package/dist/lib/types.d.ts +130 -0
  267. package/dist/lib/types.d.ts.map +1 -0
  268. package/dist/lib/types.js +2 -0
  269. package/dist/lib/types.js.map +1 -0
  270. package/dist/lib/ui/ansi.d.ts +40 -0
  271. package/dist/lib/ui/ansi.d.ts.map +1 -0
  272. package/dist/lib/ui/ansi.js +68 -0
  273. package/dist/lib/ui/ansi.js.map +1 -0
  274. package/dist/lib/ui/auth-menu.d.ts +76 -0
  275. package/dist/lib/ui/auth-menu.d.ts.map +1 -0
  276. package/dist/lib/ui/auth-menu.js +590 -0
  277. package/dist/lib/ui/auth-menu.js.map +1 -0
  278. package/dist/lib/ui/confirm.d.ts +11 -0
  279. package/dist/lib/ui/confirm.d.ts.map +1 -0
  280. package/dist/lib/ui/confirm.js +29 -0
  281. package/dist/lib/ui/confirm.js.map +1 -0
  282. package/dist/lib/ui/copy.d.ts +123 -0
  283. package/dist/lib/ui/copy.d.ts.map +1 -0
  284. package/dist/lib/ui/copy.js +127 -0
  285. package/dist/lib/ui/copy.js.map +1 -0
  286. package/dist/lib/ui/format.d.ts +62 -0
  287. package/dist/lib/ui/format.d.ts.map +1 -0
  288. package/dist/lib/ui/format.js +205 -0
  289. package/dist/lib/ui/format.js.map +1 -0
  290. package/dist/lib/ui/runtime.d.ts +43 -0
  291. package/dist/lib/ui/runtime.d.ts.map +1 -0
  292. package/dist/lib/ui/runtime.js +69 -0
  293. package/dist/lib/ui/runtime.js.map +1 -0
  294. package/dist/lib/ui/select.d.ts +60 -0
  295. package/dist/lib/ui/select.d.ts.map +1 -0
  296. package/dist/lib/ui/select.js +467 -0
  297. package/dist/lib/ui/select.js.map +1 -0
  298. package/dist/lib/ui/theme.d.ts +56 -0
  299. package/dist/lib/ui/theme.d.ts.map +1 -0
  300. package/dist/lib/ui/theme.js +186 -0
  301. package/dist/lib/ui/theme.js.map +1 -0
  302. package/dist/lib/unified-settings.d.ts +71 -0
  303. package/dist/lib/unified-settings.d.ts.map +1 -0
  304. package/dist/lib/unified-settings.js +299 -0
  305. package/dist/lib/unified-settings.js.map +1 -0
  306. package/dist/lib/utils.d.ts +29 -0
  307. package/dist/lib/utils.d.ts.map +1 -0
  308. package/dist/lib/utils.js +54 -0
  309. package/dist/lib/utils.js.map +1 -0
  310. package/package.json +115 -0
  311. package/scripts/audit-dev-allowlist.js +128 -0
  312. package/scripts/bench-format/hashline-v2.mjs +642 -0
  313. package/scripts/bench-format/models.mjs +105 -0
  314. package/scripts/bench-format/opencode.mjs +205 -0
  315. package/scripts/bench-format/render.mjs +496 -0
  316. package/scripts/bench-format/stats.mjs +54 -0
  317. package/scripts/bench-format/tasks.mjs +151 -0
  318. package/scripts/benchmark-edit-formats.mjs +1161 -0
  319. package/scripts/benchmark-render-dashboard.mjs +49 -0
  320. package/scripts/codex-multi-auth.js +6 -0
  321. package/scripts/codex-routing.js +34 -0
  322. package/scripts/codex.js +122 -0
  323. package/scripts/copy-oauth-success.js +37 -0
  324. package/scripts/install-opencode-codex-auth.js +193 -0
  325. package/scripts/test-all-models.sh +7 -0
  326. package/scripts/test-model-matrix.js +424 -0
  327. package/scripts/validate-model-map.sh +7 -0
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Token utility functions for JWT parsing and account ID extraction.
3
+ * Extracted from accounts.ts to reduce module size and improve cohesion.
4
+ */
5
+ import { decodeJWT } from "./auth.js";
6
+ import { JWT_CLAIM_PATH } from "../constants.js";
7
+ import { isRecord } from "../utils.js";
8
+ /**
9
+ * Converts a value to a trimmed string if it's a non-empty string.
10
+ * Local helper - returns undefined for non-strings (different from lib/utils.toStringValue).
11
+ */
12
+ function toStringValue(value) {
13
+ if (typeof value !== "string")
14
+ return undefined;
15
+ const trimmed = value.trim();
16
+ return trimmed ? trimmed : undefined;
17
+ }
18
+ /**
19
+ * Converts a value to boolean if possible.
20
+ */
21
+ function toBoolean(value) {
22
+ if (value === undefined || value === null)
23
+ return undefined;
24
+ if (typeof value === "boolean")
25
+ return value;
26
+ if (typeof value === "string") {
27
+ const normalized = value.trim().toLowerCase();
28
+ if (normalized === "true")
29
+ return true;
30
+ if (normalized === "false")
31
+ return false;
32
+ }
33
+ return undefined;
34
+ }
35
+ /**
36
+ * Formats account ID to last 6 characters for display.
37
+ */
38
+ function formatAccountIdSuffix(accountId) {
39
+ return accountId.length > 6 ? accountId.slice(-6) : accountId;
40
+ }
41
+ /**
42
+ * Formats a label for token-derived account candidates.
43
+ */
44
+ function formatTokenCandidateLabel(prefix, accountId) {
45
+ const suffix = formatAccountIdSuffix(accountId);
46
+ return `${prefix} [id:${suffix}]`;
47
+ }
48
+ /**
49
+ * Extracts account ID from a JWT payload.
50
+ */
51
+ function extractAccountIdFromPayload(payload) {
52
+ if (!payload)
53
+ return undefined;
54
+ const auth = payload[JWT_CLAIM_PATH];
55
+ if (isRecord(auth)) {
56
+ const id = toStringValue(auth.chatgpt_account_id);
57
+ if (id)
58
+ return id;
59
+ }
60
+ const direct = toStringValue(payload.chatgpt_account_id) ??
61
+ toStringValue(payload.account_id) ??
62
+ toStringValue(payload.accountId);
63
+ return direct;
64
+ }
65
+ /**
66
+ * Normalizes candidate arrays from various response formats.
67
+ */
68
+ function normalizeCandidateArray(value) {
69
+ if (Array.isArray(value))
70
+ return value;
71
+ if (isRecord(value)) {
72
+ const nested = value.data ??
73
+ value.items ??
74
+ value.accounts ??
75
+ value.organizations ??
76
+ value.workspaces ??
77
+ value.teams;
78
+ if (Array.isArray(nested))
79
+ return nested;
80
+ }
81
+ return [];
82
+ }
83
+ /**
84
+ * Extracts a single account candidate from a record.
85
+ */
86
+ function extractCandidateFromRecord(record, source) {
87
+ const accountId = toStringValue(record.account_id) ??
88
+ toStringValue(record.accountId) ??
89
+ toStringValue(record.chatgpt_account_id) ??
90
+ toStringValue(record.organization_id) ??
91
+ toStringValue(record.org_id) ??
92
+ toStringValue(record.workspace_id) ??
93
+ toStringValue(record.team_id) ??
94
+ toStringValue(record.id);
95
+ if (!accountId)
96
+ return null;
97
+ const name = toStringValue(record.name) ??
98
+ toStringValue(record.display_name) ??
99
+ toStringValue(record.title) ??
100
+ toStringValue(record.organization_name) ??
101
+ toStringValue(record.workspace_name) ??
102
+ toStringValue(record.team_name) ??
103
+ toStringValue(record.slug);
104
+ const type = toStringValue(record.type) ??
105
+ toStringValue(record.plan_type) ??
106
+ toStringValue(record.kind) ??
107
+ toStringValue(record.account_type);
108
+ const role = toStringValue(record.role) ??
109
+ toStringValue(record.membership_role) ??
110
+ toStringValue(record.user_role);
111
+ const isDefault = toBoolean(record.is_default ?? record.isDefault ?? record.default ?? record.primary ?? record.is_active ?? record.isActive ?? record.current);
112
+ const isPersonal = toBoolean(record.is_personal ?? record.isPersonal ?? record.personal);
113
+ const suffix = formatAccountIdSuffix(accountId);
114
+ const labelParts = [];
115
+ let labelBase = name ?? "Workspace";
116
+ if (!name && type) {
117
+ labelBase = type;
118
+ }
119
+ if (type && (!name || name.toLowerCase() !== type.toLowerCase())) {
120
+ labelParts.push(type);
121
+ }
122
+ if (role) {
123
+ labelParts.push(`role:${role}`);
124
+ }
125
+ if (isPersonal) {
126
+ labelParts.push("personal");
127
+ }
128
+ const meta = labelParts.length > 0 ? ` (${labelParts.join(", ")})` : "";
129
+ const label = `${labelBase}${meta} [id:${suffix}]`;
130
+ return {
131
+ accountId,
132
+ label,
133
+ source,
134
+ isDefault,
135
+ isPersonal,
136
+ };
137
+ }
138
+ /**
139
+ * Collects candidates from a list of records.
140
+ */
141
+ function collectCandidatesFromList(value, source) {
142
+ const result = [];
143
+ const list = normalizeCandidateArray(value);
144
+ if (list.length === 0)
145
+ return result;
146
+ for (const item of list) {
147
+ if (!isRecord(item))
148
+ continue;
149
+ const candidate = extractCandidateFromRecord(item, source);
150
+ if (candidate) {
151
+ result.push(candidate);
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ /**
157
+ * Collects candidates from a JWT payload.
158
+ */
159
+ function collectCandidatesFromPayload(payload, source) {
160
+ if (!payload || !isRecord(payload))
161
+ return [];
162
+ const candidates = [];
163
+ const keys = ["organizations", "orgs", "accounts", "workspaces", "teams"];
164
+ for (const key of keys) {
165
+ if (key in payload) {
166
+ candidates.push(...collectCandidatesFromList(payload[key], source));
167
+ }
168
+ }
169
+ const auth = payload[JWT_CLAIM_PATH];
170
+ if (isRecord(auth)) {
171
+ for (const key of keys) {
172
+ if (key in auth) {
173
+ candidates.push(...collectCandidatesFromList(auth[key], source));
174
+ }
175
+ }
176
+ }
177
+ return candidates;
178
+ }
179
+ /**
180
+ * Removes duplicate candidates by accountId.
181
+ */
182
+ function uniqueCandidates(candidates) {
183
+ const seen = new Set();
184
+ const result = [];
185
+ for (const candidate of candidates) {
186
+ if (seen.has(candidate.accountId))
187
+ continue;
188
+ seen.add(candidate.accountId);
189
+ result.push(candidate);
190
+ }
191
+ return result;
192
+ }
193
+ /**
194
+ * Select the best workspace candidate for OAuth account binding.
195
+ * Preference order:
196
+ * 1) org default that is not personal
197
+ * 2) org default (any)
198
+ * 3) id_token candidate
199
+ * 4) non-personal org candidate
200
+ * 5) token candidate
201
+ * 6) first candidate
202
+ */
203
+ export function selectBestAccountCandidate(candidates) {
204
+ if (candidates.length === 0)
205
+ return undefined;
206
+ const orgDefaultNonPersonal = candidates.find((candidate) => candidate.source === "org" && candidate.isDefault === true && candidate.isPersonal !== true);
207
+ if (orgDefaultNonPersonal)
208
+ return orgDefaultNonPersonal;
209
+ const orgDefault = candidates.find((candidate) => candidate.source === "org" && candidate.isDefault === true);
210
+ if (orgDefault)
211
+ return orgDefault;
212
+ const idTokenCandidate = candidates.find((candidate) => candidate.source === "id_token");
213
+ if (idTokenCandidate)
214
+ return idTokenCandidate;
215
+ const nonPersonalOrg = candidates.find((candidate) => candidate.source === "org" && candidate.isPersonal !== true);
216
+ if (nonPersonalOrg)
217
+ return nonPersonalOrg;
218
+ const tokenCandidate = candidates.find((candidate) => candidate.source === "token");
219
+ if (tokenCandidate)
220
+ return tokenCandidate;
221
+ return candidates[0];
222
+ }
223
+ /**
224
+ * Extracts the ChatGPT account ID from a JWT access token.
225
+ * @param accessToken - JWT access token from OAuth flow
226
+ * @returns Account ID string or undefined if not found
227
+ */
228
+ export function extractAccountId(accessToken) {
229
+ if (!accessToken)
230
+ return undefined;
231
+ const decoded = decodeJWT(accessToken);
232
+ const accountId = decoded?.[JWT_CLAIM_PATH]?.chatgpt_account_id;
233
+ return typeof accountId === "string" && accountId.trim() ? accountId : undefined;
234
+ }
235
+ /**
236
+ * Extracts the email address from OAuth tokens.
237
+ * Checks id_token first (where OpenAI puts email), then falls back to access_token.
238
+ */
239
+ export function extractAccountEmail(accessToken, idToken) {
240
+ // Try id_token first - OpenAI puts email here
241
+ if (idToken) {
242
+ const idDecoded = decodeJWT(idToken);
243
+ const idEmail = idDecoded?.email;
244
+ if (typeof idEmail === "string" && idEmail.includes("@") && idEmail.trim()) {
245
+ return idEmail;
246
+ }
247
+ }
248
+ // Fall back to access_token
249
+ if (!accessToken)
250
+ return undefined;
251
+ const decoded = decodeJWT(accessToken);
252
+ const nested = decoded?.[JWT_CLAIM_PATH];
253
+ const candidate = nested?.email ??
254
+ nested?.chatgpt_user_email ??
255
+ decoded?.email ??
256
+ decoded?.preferred_username;
257
+ if (typeof candidate === "string" && candidate.includes("@") && candidate.trim()) {
258
+ return candidate;
259
+ }
260
+ return undefined;
261
+ }
262
+ /**
263
+ * Extracts all accountId candidates from access/id tokens.
264
+ * Used to support business workspaces/organizations that are not the token default.
265
+ */
266
+ export function getAccountIdCandidates(accessToken, idToken) {
267
+ const candidates = [];
268
+ const accessId = extractAccountId(accessToken);
269
+ if (accessId) {
270
+ candidates.push({
271
+ accountId: accessId,
272
+ label: formatTokenCandidateLabel("Token account", accessId),
273
+ source: "token",
274
+ isDefault: true,
275
+ });
276
+ }
277
+ if (accessToken) {
278
+ const accessDecoded = decodeJWT(accessToken);
279
+ candidates.push(...collectCandidatesFromPayload(accessDecoded, "org"));
280
+ }
281
+ if (idToken) {
282
+ const decoded = decodeJWT(idToken);
283
+ const idAccountId = extractAccountIdFromPayload(decoded);
284
+ if (idAccountId && idAccountId !== accessId) {
285
+ candidates.push({
286
+ accountId: idAccountId,
287
+ label: formatTokenCandidateLabel("ID token account", idAccountId),
288
+ source: "id_token",
289
+ });
290
+ }
291
+ candidates.push(...collectCandidatesFromPayload(decoded, "org"));
292
+ }
293
+ return uniqueCandidates(candidates);
294
+ }
295
+ /**
296
+ * Determines if accountId should be updated from a token-derived value.
297
+ * We keep org/manual selections stable across refreshes.
298
+ */
299
+ export function shouldUpdateAccountIdFromToken(source, currentAccountId) {
300
+ if (!currentAccountId)
301
+ return true;
302
+ if (!source)
303
+ return true;
304
+ return source === "token" || source === "id_token";
305
+ }
306
+ /**
307
+ * Resolve which accountId to use for runtime API calls.
308
+ * Preserves explicit org/manual selections; only token/id_token sources auto-follow token changes.
309
+ */
310
+ export function resolveRequestAccountId(storedAccountId, source, tokenAccountId) {
311
+ if (!storedAccountId)
312
+ return tokenAccountId;
313
+ if (!shouldUpdateAccountIdFromToken(source, storedAccountId)) {
314
+ return storedAccountId;
315
+ }
316
+ return tokenAccountId ?? storedAccountId;
317
+ }
318
+ /**
319
+ * Sanitizes an email address by trimming whitespace and lowercasing.
320
+ * @param email - Email string to sanitize
321
+ * @returns Sanitized email or undefined if invalid
322
+ */
323
+ export function sanitizeEmail(email) {
324
+ if (!email)
325
+ return undefined;
326
+ const trimmed = email.trim();
327
+ if (!trimmed || !trimmed.includes("@"))
328
+ return undefined;
329
+ return trimmed.toLowerCase();
330
+ }
331
+ //# sourceMappingURL=token-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../../../lib/auth/token-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface AuthRateLimitConfig {
2
+ maxAttempts: number;
3
+ windowMs: number;
4
+ }
5
+ export declare function configureAuthRateLimit(newConfig: Partial<AuthRateLimitConfig>): void;
6
+ export declare function getAuthRateLimitConfig(): AuthRateLimitConfig;
7
+ export declare function canAttemptAuth(accountId: string): boolean;
8
+ export declare function recordAuthAttempt(accountId: string): void;
9
+ export declare function getAttemptsRemaining(accountId: string): number;
10
+ export declare function getTimeUntilReset(accountId: string): number;
11
+ export declare function resetAuthRateLimit(accountId: string): void;
12
+ export declare function resetAllAuthRateLimits(): void;
13
+ export declare class AuthRateLimitError extends Error {
14
+ readonly accountId: string;
15
+ readonly attemptsRemaining: number;
16
+ readonly resetAfterMs: number;
17
+ constructor(accountId: string, attemptsRemaining: number, resetAfterMs: number);
18
+ }
19
+ export declare function checkAuthRateLimit(accountId: string): void;
20
+ //# sourceMappingURL=auth-rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-rate-limit.d.ts","sourceRoot":"","sources":["../../lib/auth-rate-limit.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEpF;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D;AAWD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAYzD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAYzD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB3D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,iBAAiB,EAAE,MAAM;aACzB,YAAY,EAAE,MAAM;gBAFpB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,MAAM;CAMrC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQ1D"}
@@ -0,0 +1,91 @@
1
+ const DEFAULT_CONFIG = {
2
+ maxAttempts: 5,
3
+ windowMs: 60_000,
4
+ };
5
+ const attemptsByAccount = new Map();
6
+ let config = { ...DEFAULT_CONFIG };
7
+ export function configureAuthRateLimit(newConfig) {
8
+ config = { ...config, ...newConfig };
9
+ }
10
+ export function getAuthRateLimitConfig() {
11
+ return { ...config };
12
+ }
13
+ function getAccountKey(accountId) {
14
+ return accountId.toLowerCase().trim();
15
+ }
16
+ function pruneOldAttempts(record, now) {
17
+ const cutoff = now - config.windowMs;
18
+ record.timestamps = record.timestamps.filter((ts) => ts > cutoff);
19
+ }
20
+ export function canAttemptAuth(accountId) {
21
+ const key = getAccountKey(accountId);
22
+ const record = attemptsByAccount.get(key);
23
+ if (!record) {
24
+ return true;
25
+ }
26
+ const now = Date.now();
27
+ pruneOldAttempts(record, now);
28
+ return record.timestamps.length < config.maxAttempts;
29
+ }
30
+ export function recordAuthAttempt(accountId) {
31
+ const key = getAccountKey(accountId);
32
+ const now = Date.now();
33
+ let record = attemptsByAccount.get(key);
34
+ if (!record) {
35
+ record = { timestamps: [] };
36
+ attemptsByAccount.set(key, record);
37
+ }
38
+ pruneOldAttempts(record, now);
39
+ record.timestamps.push(now);
40
+ }
41
+ export function getAttemptsRemaining(accountId) {
42
+ const key = getAccountKey(accountId);
43
+ const record = attemptsByAccount.get(key);
44
+ if (!record) {
45
+ return config.maxAttempts;
46
+ }
47
+ const now = Date.now();
48
+ pruneOldAttempts(record, now);
49
+ return Math.max(0, config.maxAttempts - record.timestamps.length);
50
+ }
51
+ export function getTimeUntilReset(accountId) {
52
+ const key = getAccountKey(accountId);
53
+ const record = attemptsByAccount.get(key);
54
+ if (!record || record.timestamps.length === 0) {
55
+ return 0;
56
+ }
57
+ const now = Date.now();
58
+ pruneOldAttempts(record, now);
59
+ if (record.timestamps.length === 0) {
60
+ return 0;
61
+ }
62
+ const oldestAttempt = Math.min(...record.timestamps);
63
+ const resetTime = oldestAttempt + config.windowMs;
64
+ return Math.max(0, resetTime - now);
65
+ }
66
+ export function resetAuthRateLimit(accountId) {
67
+ const key = getAccountKey(accountId);
68
+ attemptsByAccount.delete(key);
69
+ }
70
+ export function resetAllAuthRateLimits() {
71
+ attemptsByAccount.clear();
72
+ }
73
+ export class AuthRateLimitError extends Error {
74
+ accountId;
75
+ attemptsRemaining;
76
+ resetAfterMs;
77
+ constructor(accountId, attemptsRemaining, resetAfterMs) {
78
+ const resetSeconds = Math.ceil(resetAfterMs / 1000);
79
+ super(`Auth rate limit exceeded for account. Retry after ${resetSeconds}s`);
80
+ this.accountId = accountId;
81
+ this.attemptsRemaining = attemptsRemaining;
82
+ this.resetAfterMs = resetAfterMs;
83
+ this.name = "AuthRateLimitError";
84
+ }
85
+ }
86
+ export function checkAuthRateLimit(accountId) {
87
+ if (!canAttemptAuth(accountId)) {
88
+ throw new AuthRateLimitError(accountId, getAttemptsRemaining(accountId), getTimeUntilReset(accountId));
89
+ }
90
+ }
91
+ //# sourceMappingURL=auth-rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-rate-limit.js","sourceRoot":"","sources":["../../lib/auth-rate-limit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface UpdateCheckResult {
2
+ hasUpdate: boolean;
3
+ currentVersion: string;
4
+ latestVersion: string | null;
5
+ updateCommand: string;
6
+ }
7
+ export declare function checkForUpdates(force?: boolean): Promise<UpdateCheckResult>;
8
+ export declare function checkAndNotify(showToast?: (message: string, variant: "info" | "warning") => Promise<void>): Promise<void>;
9
+ export declare function clearUpdateCache(): void;
10
+ //# sourceMappingURL=auto-update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update-checker.d.ts","sourceRoot":"","sources":["../../lib/auto-update-checker.ts"],"names":[],"mappings":"AA6LA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,eAAe,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+B/E;AAED,wBAAsB,cAAc,CAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC"}