codex-multi-auth 0.1.3 → 0.1.5

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 (86) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +7 -10
  3. package/assets/readme-hero.svg +31 -31
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +51 -13
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/auth/auth.d.ts +6 -2
  8. package/dist/lib/auth/auth.d.ts.map +1 -1
  9. package/dist/lib/auth/auth.js +34 -11
  10. package/dist/lib/auth/auth.js.map +1 -1
  11. package/dist/lib/auth/server.d.ts +1 -1
  12. package/dist/lib/auth/server.js +3 -3
  13. package/dist/lib/codex-cli/state.d.ts +9 -0
  14. package/dist/lib/codex-cli/state.d.ts.map +1 -1
  15. package/dist/lib/codex-cli/state.js +14 -0
  16. package/dist/lib/codex-cli/state.js.map +1 -1
  17. package/dist/lib/codex-cli/writer.d.ts.map +1 -1
  18. package/dist/lib/codex-cli/writer.js +106 -14
  19. package/dist/lib/codex-cli/writer.js.map +1 -1
  20. package/dist/lib/codex-manager/settings-hub.d.ts +16 -1
  21. package/dist/lib/codex-manager/settings-hub.d.ts.map +1 -1
  22. package/dist/lib/codex-manager/settings-hub.js +28 -2
  23. package/dist/lib/codex-manager/settings-hub.js.map +1 -1
  24. package/dist/lib/codex-manager.d.ts +1 -0
  25. package/dist/lib/codex-manager.d.ts.map +1 -1
  26. package/dist/lib/codex-manager.js +319 -16
  27. package/dist/lib/codex-manager.js.map +1 -1
  28. package/dist/lib/context-overflow.js +10 -10
  29. package/dist/lib/oauth-success.html +192 -260
  30. package/dist/lib/parallel-probe.d.ts +7 -0
  31. package/dist/lib/parallel-probe.d.ts.map +1 -1
  32. package/dist/lib/parallel-probe.js +37 -9
  33. package/dist/lib/parallel-probe.js.map +1 -1
  34. package/dist/lib/prompts/codex.js +2 -2
  35. package/dist/lib/refresh-queue.d.ts +4 -5
  36. package/dist/lib/refresh-queue.d.ts.map +1 -1
  37. package/dist/lib/refresh-queue.js +99 -21
  38. package/dist/lib/refresh-queue.js.map +1 -1
  39. package/dist/lib/request/fetch-helpers.d.ts +12 -4
  40. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  41. package/dist/lib/request/fetch-helpers.js +53 -25
  42. package/dist/lib/request/fetch-helpers.js.map +1 -1
  43. package/dist/lib/request/helpers/tool-utils.d.ts.map +1 -1
  44. package/dist/lib/request/helpers/tool-utils.js +36 -6
  45. package/dist/lib/request/helpers/tool-utils.js.map +1 -1
  46. package/dist/lib/request/rate-limit-backoff.d.ts +7 -0
  47. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -1
  48. package/dist/lib/request/rate-limit-backoff.js +24 -4
  49. package/dist/lib/request/rate-limit-backoff.js.map +1 -1
  50. package/dist/lib/request/request-transformer.d.ts +10 -0
  51. package/dist/lib/request/request-transformer.d.ts.map +1 -1
  52. package/dist/lib/request/request-transformer.js +61 -37
  53. package/dist/lib/request/request-transformer.js.map +1 -1
  54. package/dist/lib/rotation.d.ts +19 -0
  55. package/dist/lib/rotation.d.ts.map +1 -1
  56. package/dist/lib/rotation.js +60 -39
  57. package/dist/lib/rotation.js.map +1 -1
  58. package/dist/lib/ui/copy.d.ts +1 -1
  59. package/dist/lib/ui/copy.js +1 -1
  60. package/dist/lib/utils.d.ts +6 -0
  61. package/dist/lib/utils.d.ts.map +1 -1
  62. package/dist/lib/utils.js +11 -0
  63. package/dist/lib/utils.js.map +1 -1
  64. package/node_modules/@codex-ai/plugin/dist/index.d.ts +1 -1
  65. package/node_modules/@codex-ai/plugin/dist/tool.d.ts +41 -41
  66. package/node_modules/@codex-ai/plugin/dist/tool.js +28 -28
  67. package/package.json +9 -5
  68. package/scripts/audit-dev-allowlist.js +186 -94
  69. package/scripts/bench-format/hashline-v2.mjs +642 -642
  70. package/scripts/bench-format/render.mjs +496 -496
  71. package/scripts/bench-format/stats.mjs +54 -54
  72. package/scripts/bench-format/tasks.mjs +151 -151
  73. package/scripts/benchmark-render-dashboard.mjs +49 -49
  74. package/scripts/benchmark-runtime-path.mjs +166 -0
  75. package/scripts/codex-multi-auth.js +1 -1
  76. package/scripts/codex.js +86 -26
  77. package/scripts/copy-oauth-success.js +42 -3
  78. package/scripts/install-codex-auth-utils.js +69 -0
  79. package/scripts/install-codex-auth.js +23 -14
  80. package/scripts/test-all-models.sh +7 -7
  81. package/scripts/test-model-matrix.js +108 -80
  82. package/scripts/validate-model-map.sh +7 -7
  83. package/vendor/codex-ai-plugin/dist/index.d.ts +1 -1
  84. package/vendor/codex-ai-plugin/dist/tool.d.ts +41 -41
  85. package/vendor/codex-ai-plugin/dist/tool.js +28 -28
  86. package/vendor/codex-ai-sdk/dist/index.d.ts +3 -3
@@ -3,336 +3,268 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1" />
6
- <title>OpenAI Codex Sign-in Complete</title>
6
+ <title>OpenAI Codex Callback Received</title>
7
7
  <style>
8
+ /* Space Grotesk import removed to avoid CSP font-src violations; rely on system stack. */
9
+
8
10
  :root {
9
- --bg: #040608;
10
- --bg2: #0a1210;
11
- --card: #0a0f0d;
12
- --line: #1f3a2f;
13
- --line-soft: #13261f;
14
- --text: #e6f6ee;
15
- --muted: #9ac3b1;
16
- --green: #35d28a;
17
- --green-strong: #13b06e;
18
- --warn: #f2cc60;
11
+ --bg: #020403;
12
+ --bg2: #050908;
13
+ --surface: rgba(6, 10, 9, 0.92);
14
+ --border: rgba(255, 255, 255, 0.08);
15
+ --divider: rgba(255, 255, 255, 0.07);
16
+ --text: #f5fbf7;
17
+ --muted: rgba(245, 251, 247, 0.68);
18
+ --accent: #49f1a8;
19
+ --accent-soft: rgba(73, 241, 168, 0.15);
19
20
  }
20
21
 
21
- * { box-sizing: border-box; }
22
+ * {
23
+ box-sizing: border-box;
24
+ }
22
25
 
23
- html, body {
26
+ body {
24
27
  margin: 0;
25
- width: 100%;
26
- height: 100%;
27
- font-family: Consolas, "Cascadia Mono", "SFMono-Regular", Menlo, Monaco, monospace;
28
- background: radial-gradient(1300px 700px at 20% -10%, #0f2b21 0%, transparent 55%),
29
- radial-gradient(1000px 560px at 100% 0%, #0a2019 0%, transparent 60%),
28
+ min-height: 100vh;
29
+ font-family: "Segoe UI", system-ui, -apple-system, "IBM Plex Sans", sans-serif;
30
+ background: radial-gradient(circle at top, rgba(73, 241, 168, 0.12), transparent 55%),
30
31
  linear-gradient(180deg, var(--bg), var(--bg2));
31
32
  color: var(--text);
32
- overflow-x: hidden;
33
- overflow-y: auto;
34
- }
35
-
36
- .grid {
37
- position: fixed;
38
- inset: 0;
39
- background-image:
40
- linear-gradient(to right, rgba(53, 210, 138, 0.06) 1px, transparent 1px),
41
- linear-gradient(to bottom, rgba(53, 210, 138, 0.05) 1px, transparent 1px);
42
- background-size: 28px 28px;
43
- mask-image: radial-gradient(circle at center, black 35%, transparent 90%);
44
- pointer-events: none;
45
- animation: drift 16s linear infinite;
46
- }
47
-
48
- .scanline {
49
- position: fixed;
50
- inset: 0;
51
- pointer-events: none;
52
- background: linear-gradient(180deg, transparent 0%, rgba(53, 210, 138, 0.07) 48%, transparent 52%, transparent 100%);
53
- animation: sweep 5s linear infinite;
54
- opacity: 0.45;
33
+ display: grid;
34
+ place-items: center;
35
+ padding: 32px 16px;
55
36
  }
56
37
 
57
- @keyframes sweep {
58
- 0% { transform: translateY(-100%); }
59
- 100% { transform: translateY(100%); }
38
+ main {
39
+ width: min(440px, 100%);
40
+ background: var(--surface);
41
+ border-radius: 22px;
42
+ border: 1px solid var(--border);
43
+ padding: 32px;
44
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55);
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: 18px;
60
48
  }
61
49
 
62
- @keyframes drift {
63
- from { transform: translateY(0); }
64
- to { transform: translateY(28px); }
50
+ .eyebrow {
51
+ font-size: 12px;
52
+ text-transform: uppercase;
53
+ letter-spacing: 0.22em;
54
+ color: var(--muted);
65
55
  }
66
56
 
67
- .wrap {
57
+ .icon {
58
+ width: 64px;
59
+ height: 64px;
60
+ border-radius: 16px;
61
+ border: 1px solid var(--border);
62
+ background: var(--accent-soft);
63
+ display: grid;
64
+ place-items: center;
65
+ color: var(--accent);
66
+ margin: 4px 0 6px;
68
67
  position: relative;
69
- width: min(860px, calc(100vw - 32px));
70
- margin: 24px auto;
71
- top: 50%;
72
- transform: translateY(-50%);
73
- border: 1px solid var(--line);
74
- border-radius: 14px;
75
- background: linear-gradient(180deg, rgba(10, 16, 13, 0.94), rgba(6, 11, 9, 0.94));
76
- box-shadow: 0 28px 80px rgba(0,0,0,0.58), 0 0 0 1px rgba(53,210,138,0.08) inset;
77
- overflow: hidden;
78
- animation: pop 380ms ease-out;
68
+ animation: fade 1s ease both;
79
69
  }
80
70
 
81
- @keyframes pop {
82
- from { opacity: 0; transform: translateY(-48%) scale(0.985); }
83
- to { opacity: 1; transform: translateY(-50%) scale(1); }
71
+ .icon::after {
72
+ content: "";
73
+ width: 20px;
74
+ height: 12px;
75
+ border-left: 3px solid currentColor;
76
+ border-bottom: 3px solid currentColor;
77
+ transform: rotate(-45deg);
84
78
  }
85
79
 
86
- .titlebar {
87
- display: flex;
88
- align-items: center;
89
- gap: 12px;
90
- padding: 12px 16px;
91
- border-bottom: 1px solid var(--line-soft);
92
- background: rgba(6, 12, 10, 0.9);
80
+ h1 {
81
+ margin: 0;
82
+ font-size: clamp(26px, 4vw, 32px);
83
+ letter-spacing: -0.02em;
93
84
  }
94
85
 
95
- .lights { display: flex; gap: 6px; }
96
- .dot {
97
- width: 10px;
98
- height: 10px;
99
- border-radius: 999px;
100
- background: #375a4a;
101
- border: 1px solid #2b463b;
102
- }
103
- .dot.ok {
104
- background: var(--green);
105
- border-color: #1a6f46;
106
- box-shadow: 0 0 8px rgba(53,210,138,0.65);
107
- animation: blink 1.6s ease-in-out infinite;
86
+ .lead {
87
+ margin: 0;
88
+ color: var(--muted);
89
+ font-size: 15px;
90
+ line-height: 1.6;
108
91
  }
109
92
 
110
- @keyframes blink {
111
- 0%, 100% { opacity: 1; }
112
- 50% { opacity: 0.55; }
93
+ .state {
94
+ display: flex;
95
+ align-items: baseline;
96
+ justify-content: space-between;
97
+ padding: 16px 18px;
98
+ border-radius: 16px;
99
+ background: rgba(8, 14, 11, 0.75);
100
+ border: 1px solid var(--border);
113
101
  }
114
102
 
115
- .bar-title {
103
+ .state span {
116
104
  font-size: 13px;
117
- letter-spacing: 0.02em;
105
+ text-transform: uppercase;
106
+ letter-spacing: 0.15em;
118
107
  color: var(--muted);
119
- white-space: nowrap;
120
- overflow: hidden;
121
- text-overflow: ellipsis;
122
- }
123
-
124
- .content {
125
- padding: 20px;
126
- display: grid;
127
- grid-template-columns: 1.15fr 0.85fr;
128
- gap: 16px;
129
108
  }
130
109
 
131
- .left {
132
- border: 1px solid var(--line-soft);
133
- border-radius: 10px;
134
- padding: 18px;
135
- background: rgba(8, 14, 11, 0.62);
136
- }
137
-
138
- .right {
139
- border: 1px solid var(--line-soft);
140
- border-radius: 10px;
141
- padding: 16px;
142
- background: rgba(8, 14, 11, 0.62);
143
- }
144
-
145
- .kicker {
146
- color: var(--green);
147
- font-size: 12px;
148
- text-transform: uppercase;
149
- letter-spacing: 0.11em;
150
- margin-bottom: 10px;
110
+ .state strong {
111
+ font-size: 20px;
112
+ color: var(--accent);
113
+ font-weight: 600;
151
114
  }
152
115
 
153
- h1 {
154
- margin: 0 0 10px;
155
- font-size: clamp(22px, 3.2vw, 29px);
156
- line-height: 1.2;
157
- letter-spacing: -0.02em;
116
+ .status-list {
117
+ list-style: none;
118
+ margin: 8px 0 0;
119
+ padding: 0;
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: 10px;
158
123
  }
159
124
 
160
- .subtitle {
161
- margin: 0 0 14px;
162
- color: var(--muted);
125
+ .status-list li {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ border-bottom: 1px solid var(--divider);
130
+ padding-bottom: 8px;
163
131
  font-size: 14px;
164
- line-height: 1.5;
165
132
  }
166
133
 
167
- .badge {
168
- display: inline-flex;
169
- align-items: center;
170
- gap: 8px;
171
- margin: 0 0 14px;
172
- padding: 7px 10px;
173
- border-radius: 999px;
174
- border: 1px solid rgba(53,210,138,0.4);
175
- background: rgba(53,210,138,0.12);
176
- color: #d9f9e9;
177
- font-size: 12px;
178
- font-weight: 700;
179
- letter-spacing: 0.05em;
180
- text-transform: uppercase;
134
+ .status-list li:last-child {
135
+ border-bottom: none;
136
+ padding-bottom: 0;
181
137
  }
182
138
 
183
- .badge .pulse {
184
- width: 8px;
185
- height: 8px;
186
- border-radius: 999px;
187
- background: var(--green);
188
- box-shadow: 0 0 9px rgba(53,210,138,0.85);
189
- animation: ping 1.2s ease-out infinite;
139
+ .status-list span {
140
+ color: var(--muted);
141
+ font-size: 13px;
142
+ letter-spacing: 0.02em;
190
143
  }
191
144
 
192
- @keyframes ping {
193
- 0% { transform: scale(1); opacity: 1; }
194
- 100% { transform: scale(1.8); opacity: 0.1; }
145
+ .status-list .ok {
146
+ color: var(--accent);
147
+ font-weight: 500;
195
148
  }
196
149
 
197
- .steps {
198
- margin: 0;
199
- padding: 0;
200
- list-style: none;
150
+ .meta {
151
+ border-top: 1px solid var(--divider);
152
+ padding-top: 14px;
201
153
  display: grid;
202
- gap: 8px;
154
+ gap: 10px;
203
155
  }
204
156
 
205
- .steps li {
206
- border: 1px solid var(--line-soft);
207
- background: rgba(7, 12, 10, 0.72);
208
- border-radius: 8px;
209
- padding: 9px 10px;
210
- color: #cde6db;
211
- font-size: 13px;
157
+ .meta-row {
212
158
  display: flex;
213
- align-items: center;
214
- gap: 8px;
215
- }
216
-
217
- .steps li::before {
218
- content: ">";
219
- color: var(--green);
220
- font-weight: 700;
159
+ justify-content: space-between;
160
+ align-items: baseline;
161
+ font-size: 13px;
162
+ color: var(--muted);
221
163
  }
222
164
 
223
- .steps li:last-child::before { content: "*"; }
224
-
225
- .terminal {
226
- border: 1px solid var(--line-soft);
165
+ .meta-row code {
166
+ font-family: "Segoe UI", system-ui, -apple-system, "SFMono-Regular", Menlo, monospace;
167
+ background: rgba(255, 255, 255, 0.04);
227
168
  border-radius: 8px;
228
- padding: 12px;
229
- background: #060b09;
230
- min-height: 180px;
169
+ padding: 4px 8px;
170
+ color: var(--text);
231
171
  }
232
172
 
233
- .prompt {
234
- color: #cde6db;
173
+ .tip {
235
174
  margin: 0;
236
- font-size: 12px;
237
- line-height: 1.65;
238
- white-space: pre-wrap;
175
+ font-size: 13px;
176
+ color: var(--muted);
177
+ border-top: 1px solid var(--divider);
178
+ padding-top: 14px;
239
179
  }
240
180
 
241
- .prompt .ok { color: var(--green); }
242
- .prompt .muted { color: var(--muted); }
243
- .prompt .warn { color: var(--warn); }
244
-
245
- .progress {
246
- margin-top: 10px;
247
- height: 8px;
248
- border-radius: 999px;
249
- background: #0b1a14;
250
- border: 1px solid var(--line-soft);
251
- overflow: hidden;
252
- position: relative;
181
+ .tip strong {
182
+ color: var(--text);
253
183
  }
254
184
 
255
- .progress span {
256
- display: block;
257
- width: 72%;
258
- height: 100%;
259
- background: linear-gradient(90deg, var(--green-strong), var(--green));
260
- animation: load 1.8s ease-in-out infinite;
185
+ footer {
186
+ font-size: 12px;
187
+ color: var(--muted);
188
+ text-align: center;
261
189
  }
262
190
 
263
- @keyframes load {
264
- 0%, 100% { width: 62%; }
265
- 50% { width: 88%; }
191
+ @keyframes fade {
192
+ from { opacity: 0; transform: translateY(6px); }
193
+ to { opacity: 1; transform: translateY(0); }
266
194
  }
267
195
 
268
- .footer {
269
- border-top: 1px solid var(--line-soft);
270
- padding: 11px 16px;
271
- color: var(--muted);
272
- font-size: 12px;
273
- display: flex;
274
- justify-content: space-between;
275
- gap: 8px;
276
- flex-wrap: wrap;
277
- background: rgba(6, 11, 9, 0.9);
196
+ @media (prefers-reduced-motion: reduce) {
197
+ .icon {
198
+ animation: none;
199
+ }
278
200
  }
279
201
 
280
- .footer strong { color: var(--text); font-weight: 700; }
202
+ @media (max-width: 480px) {
203
+ main {
204
+ padding: 24px;
205
+ border-radius: 18px;
206
+ }
207
+
208
+ .state {
209
+ flex-direction: column;
210
+ align-items: flex-start;
211
+ gap: 4px;
212
+ }
281
213
 
282
- @media (max-width: 840px) {
283
- .content {
284
- grid-template-columns: 1fr;
214
+ .status-list li {
215
+ flex-direction: column;
216
+ align-items: flex-start;
217
+ gap: 2px;
218
+ }
219
+
220
+ .meta-row {
221
+ flex-direction: column;
222
+ gap: 4px;
285
223
  }
286
224
  }
287
225
  </style>
288
226
  </head>
289
227
  <body>
290
- <div class="grid" aria-hidden="true"></div>
291
- <div class="scanline" aria-hidden="true"></div>
292
-
293
- <main class="wrap" role="main" aria-label="OAuth callback success">
294
- <header class="titlebar">
295
- <div class="lights">
296
- <span class="dot"></span>
297
- <span class="dot"></span>
298
- <span class="dot ok"></span>
228
+ <main role="main" aria-label="OAuth callback received">
229
+ <p class="eyebrow">OpenAI Codex</p>
230
+ <div class="icon" aria-hidden="true"></div>
231
+ <h1>Callback received</h1>
232
+ <p class="lead">Return to your terminal to complete sign-in.</p>
233
+ <div class="state">
234
+ <span>Status</span>
235
+ <strong>Processing</strong>
236
+ </div>
237
+ <ul class="status-list" aria-label="OAuth steps">
238
+ <li>
239
+ <span>Authorization code</span>
240
+ <span class="ok">received</span>
241
+ </li>
242
+ <li>
243
+ <span>Token exchange</span>
244
+ <span>running in terminal</span>
245
+ </li>
246
+ <li>
247
+ <span>Credentials</span>
248
+ <span>persisting after terminal completes</span>
249
+ </li>
250
+ <li>
251
+ <span>Session</span>
252
+ <span>activating in terminal</span>
253
+ </li>
254
+ </ul>
255
+ <section class="meta" aria-label="Callback summary">
256
+ <div class="meta-row">
257
+ <span>Callback</span>
258
+ <!-- Port 1455 is fixed by design via REDIRECT_URI -->
259
+ <code>localhost:1455</code>
260
+ </div>
261
+ <div class="meta-row">
262
+ <span>Tip</span>
263
+ <span>Close this tab when you are done.</span>
299
264
  </div>
300
- <div class="bar-title">OpenAI Codex - Callback Received</div>
301
- </header>
302
-
303
- <section class="content">
304
- <article class="left">
305
- <p class="kicker">OpenAI Codex</p>
306
- <h1>Sign-in Complete</h1>
307
- <p class="subtitle">Account connected. Return to terminal.</p>
308
-
309
- <div class="badge"><span class="pulse"></span> Connected</div>
310
-
311
- <ul class="steps" aria-label="Completion steps">
312
- <li>Authorization code received</li>
313
- <li>Token exchange complete</li>
314
- <li>Credentials saved to local Codex auth storage</li>
315
- <li>Session ready</li>
316
- </ul>
317
- </article>
318
-
319
- <aside class="right" aria-label="Terminal status">
320
- <div class="terminal">
321
- <pre class="prompt"><span class="ok">[ok]</span> callback received on 127.0.0.1:1455
322
- <span class="ok">[ok]</span> secure token flow complete
323
- <span class="ok">[ok]</span> account saved
324
-
325
- <span class="muted">next:</span> return to terminal
326
- <span class="warn">tip:</span> close this tab</pre>
327
- <div class="progress" aria-hidden="true"><span></span></div>
328
- </div>
329
- </aside>
330
265
  </section>
331
-
332
- <footer class="footer">
333
- <span>Status: <strong>Connected</strong></span>
334
- <span>Back to terminal to continue.</span>
335
- </footer>
266
+ <p class="tip"><strong>Next:</strong> return to the terminal window to continue.</p>
267
+ <footer>Back to terminal to continue.</footer>
336
268
  </main>
337
269
  </body>
338
270
  </html>
@@ -14,10 +14,17 @@ export interface ParallelProbeOptions {
14
14
  maxConcurrency: number;
15
15
  timeoutMs: number;
16
16
  }
17
+ export interface GetTopCandidatesParams {
18
+ accountManager: AccountManager;
19
+ modelFamily: ModelFamily;
20
+ model: string | null;
21
+ maxCandidates: number;
22
+ }
17
23
  /**
18
24
  * Get top N candidates ranked by hybrid score WITHOUT mutating AccountManager state.
19
25
  * Uses getAccountsSnapshot() and ranks by health + tokens + freshness.
20
26
  */
27
+ export declare function getTopCandidates(params: GetTopCandidatesParams): ManagedAccount[];
21
28
  export declare function getTopCandidates(accountManager: AccountManager, modelFamily: ModelFamily, model: string | null, maxCandidates: number): ManagedAccount[];
22
29
  /**
23
30
  * Probe accounts in parallel with first-success-wins racing.
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-probe.d.ts","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWtD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,aAAa,EAAE,MAAM,GACnB,cAAc,EAAE,CAuClB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAC9C,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACrE,QAAQ,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC1C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CA8ChC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAKlF"}
1
+ {"version":3,"file":"parallel-probe.d.ts","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWtD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,sBAAsB,GAC5B,cAAc,EAAE,CAAC;AACpB,wBAAgB,gBAAgB,CAC/B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,aAAa,EAAE,MAAM,GACnB,cAAc,EAAE,CAAC;AAqFpB;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAC9C,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACrE,QAAQ,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC1C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CA8ChC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAKlF"}
@@ -2,21 +2,49 @@ import { createLogger } from "./logger.js";
2
2
  import { getHealthTracker, getTokenTracker, } from "./rotation.js";
3
3
  import { clearExpiredRateLimits, isRateLimitedForFamily } from "./accounts/rate-limits.js";
4
4
  const log = createLogger("parallel-probe");
5
- /**
6
- * Get top N candidates ranked by hybrid score WITHOUT mutating AccountManager state.
7
- * Uses getAccountsSnapshot() and ranks by health + tokens + freshness.
8
- */
9
- export function getTopCandidates(accountManager, modelFamily, model, maxCandidates) {
10
- const accounts = accountManager.getAccountsSnapshot();
5
+ export function getTopCandidates(accountManagerOrParams, modelFamily, model, maxCandidates) {
6
+ const useNamedParams = typeof modelFamily === "undefined";
7
+ let resolvedAccountManager;
8
+ let resolvedModelFamily;
9
+ let resolvedModel;
10
+ let resolvedMaxCandidates;
11
+ if (useNamedParams) {
12
+ const namedParams = accountManagerOrParams;
13
+ resolvedAccountManager = namedParams.accountManager;
14
+ resolvedModelFamily = namedParams.modelFamily;
15
+ resolvedModel = namedParams.model;
16
+ resolvedMaxCandidates = namedParams.maxCandidates;
17
+ }
18
+ else {
19
+ resolvedAccountManager = accountManagerOrParams;
20
+ resolvedModelFamily = modelFamily;
21
+ resolvedModel = model;
22
+ resolvedMaxCandidates = maxCandidates;
23
+ }
24
+ if (!resolvedAccountManager ||
25
+ typeof resolvedAccountManager.getAccountsSnapshot !== "function") {
26
+ throw new TypeError("getTopCandidates requires accountManager");
27
+ }
28
+ if (!resolvedModelFamily) {
29
+ throw new TypeError("getTopCandidates requires modelFamily");
30
+ }
31
+ if (typeof resolvedMaxCandidates !== "number" ||
32
+ !Number.isInteger(resolvedMaxCandidates) ||
33
+ resolvedMaxCandidates <= 0) {
34
+ throw new TypeError("getTopCandidates requires maxCandidates to be a positive integer");
35
+ }
36
+ const normalizedModelFamily = resolvedModelFamily;
37
+ const normalizedMaxCandidates = resolvedMaxCandidates;
38
+ const accounts = resolvedAccountManager.getAccountsSnapshot();
11
39
  if (accounts.length === 0)
12
40
  return [];
13
- const quotaKey = model ? `${modelFamily}:${model}` : modelFamily;
41
+ const quotaKey = resolvedModel ? `${normalizedModelFamily}:${resolvedModel}` : normalizedModelFamily;
14
42
  const healthTracker = getHealthTracker();
15
43
  const tokenTracker = getTokenTracker();
16
44
  const accountsWithMetrics = [];
17
45
  for (const account of accounts) {
18
46
  clearExpiredRateLimits(account);
19
- const isRateLimited = isRateLimitedForFamily(account, modelFamily, model);
47
+ const isRateLimited = isRateLimitedForFamily(account, normalizedModelFamily, resolvedModel);
20
48
  const isCoolingDown = account.coolingDownUntil !== undefined && account.coolingDownUntil > Date.now();
21
49
  const isAvailable = !isRateLimited && !isCoolingDown;
22
50
  accountsWithMetrics.push({
@@ -38,7 +66,7 @@ export function getTopCandidates(accountManager, modelFamily, model, maxCandidat
38
66
  return { ...a, score };
39
67
  });
40
68
  scored.sort((a, b) => b.score - a.score);
41
- return scored.slice(0, maxCandidates).map((s) => s.account);
69
+ return scored.slice(0, normalizedMaxCandidates).map((s) => s.account);
42
70
  }
43
71
  /**
44
72
  * Probe accounts in parallel with first-success-wins racing.
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-probe.js","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parallel-probe.js","sourceRoot":"","sources":["../../lib/parallel-probe.ts"],"names":[],"mappings":"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"}
@@ -307,7 +307,7 @@ YOU ARE IN A DIFFERENT ENVIRONMENT. These instructions override ALL previous too
307
307
 
308
308
  <tool_replacements priority="0">
309
309
  <critical_rule priority="0">
310
- apply_patch/applyPatch are Codex names, but host tool names vary by version.
310
+ apply_patch/applyPatch are Codex names, but host tool names vary by version.
311
311
  - Inspect the actual tool list before editing.
312
312
  - If edit exists: use edit for precise in-place string replacements and hashline edits.
313
313
  - If edit is absent and apply_patch exists: use apply_patch for those precise/hashline edits in this plugin.
@@ -329,7 +329,7 @@ File Operations:
329
329
  - write - Create new files (if available)
330
330
  - edit - Modify existing files with string replacement (version-dependent)
331
331
  - oldString must be literal text from the current file; never pass unresolved placeholders like \${TARGET_SNIPPET}
332
- - apply_patch - May be the edit/patch tool name in newer host builds (version-dependent)
332
+ - apply_patch - May be the edit/patch tool name in newer host builds (version-dependent)
333
333
  - hashline_read - Read lines with hashline refs (L<line>#<hash>) for deterministic edits
334
334
  - patch - Apply diff patches (version-dependent)
335
335
  - read - Read file contents