|
202 | 202 | let streamingText = ''; |
203 | 203 | let currentStreamEl = null; |
204 | 204 |
|
205 | | -// Get auth token: URL param → cookie → Tauri state |
206 | | -function getToken() { |
| 205 | +// Auth token cache |
| 206 | +let cachedToken = null; |
| 207 | + |
| 208 | +// Get auth token: URL param → cookie → Rust session |
| 209 | +function getTokenSync() { |
| 210 | + if (cachedToken) return cachedToken; |
207 | 211 | // 1. URL query param (passed by open_cli_window) |
208 | 212 | const params = new URLSearchParams(window.location.search); |
209 | 213 | const paramToken = params.get('token'); |
210 | 214 | if (paramToken) { |
211 | | - console.log('[CLI] Token from URL param:', paramToken.substring(0, 20) + '...'); |
| 215 | + console.log('[CLI] Token from URL param'); |
| 216 | + cachedToken = paramToken; |
212 | 217 | return paramToken; |
213 | 218 | } |
214 | 219 | // 2. Cookie fallback (same origin in Tauri webview) |
215 | 220 | const match = document.cookie.match(/(^| )access_token=([^;]+)/); |
216 | 221 | const cookieToken = match ? decodeURIComponent(match[2]) : null; |
217 | 222 | if (cookieToken) { |
218 | | - console.log('[CLI] Token from cookie:', cookieToken.substring(0, 20) + '...'); |
| 223 | + console.log('[CLI] Token from cookie'); |
| 224 | + cachedToken = cookieToken; |
219 | 225 | return cookieToken; |
220 | 226 | } |
| 227 | + return null; |
| 228 | +} |
| 229 | + |
| 230 | +// Async token getter: also tries Rust session as last resort |
| 231 | +async function getToken() { |
| 232 | + const syncToken = getTokenSync(); |
| 233 | + if (syncToken) return syncToken; |
| 234 | + // 3. Rust session fallback (token stored when open_cli_window was called) |
| 235 | + try { |
| 236 | + const rustToken = await invoke('cli_get_token'); |
| 237 | + if (rustToken) { |
| 238 | + console.log('[CLI] Token from Rust session'); |
| 239 | + cachedToken = rustToken; |
| 240 | + return rustToken; |
| 241 | + } |
| 242 | + } catch (e) { |
| 243 | + console.warn('[CLI] Failed to get token from Rust:', e); |
| 244 | + } |
221 | 245 | console.warn('[CLI] No auth token found!'); |
222 | 246 | return null; |
223 | 247 | } |
224 | 248 |
|
225 | 249 | // Load providers |
226 | 250 | async function loadProviders() { |
227 | 251 | try { |
228 | | - const token = getToken(); |
| 252 | + const token = await getToken(); |
229 | 253 | const providers = await invoke('cli_list_providers', { xgenToken: token }); |
230 | 254 | const available = providers.filter(p => p.configured && p.available); |
231 | 255 | providerSelect.innerHTML = available.map(p => |
|
291 | 315 | currentStreamEl = addMessage('assistant', ''); |
292 | 316 |
|
293 | 317 | try { |
294 | | - const token = getToken(); |
| 318 | + const token = await getToken(); |
295 | 319 | await invoke('cli_send_message', { |
296 | 320 | message: text, |
297 | 321 | xgenToken: token, |
|
379 | 403 | }); |
380 | 404 |
|
381 | 405 | // Initialize |
382 | | -const initToken = getToken(); |
383 | | -if (!initToken) { |
384 | | - addMessage('system', '⚠️ 인증 토큰이 없습니다. 로그인 후 AI CLI를 다시 열어주세요.'); |
385 | | -} |
386 | | -loadProviders(); |
| 406 | +(async () => { |
| 407 | + const initToken = await getToken(); |
| 408 | + if (!initToken) { |
| 409 | + addMessage('system', '⚠️ 인증 토큰이 없습니다. 로그인 후 AI CLI를 다시 열어주세요.'); |
| 410 | + } else { |
| 411 | + addMessage('system', '✅ 인증 완료. 명령을 입력하세요.'); |
| 412 | + } |
| 413 | + loadProviders(); |
| 414 | +})(); |
387 | 415 | </script> |
388 | 416 | </body> |
389 | 417 | </html> |
0 commit comments