61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import axios from 'axios'
|
|
import { getOauthConfig } from '../../constants/oauth.js'
|
|
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
|
|
import { getAuthHeaders } from '../../utils/http.js'
|
|
import { logError } from '../../utils/log.js'
|
|
import { getClaudeCodeUserAgent } from '../../utils/userAgent.js'
|
|
|
|
/**
|
|
* Fetch the user's first Claude Code token date and store in config.
|
|
* This is called after successful login to cache when they started using Claude Code.
|
|
*/
|
|
export async function fetchAndStoreClaudeCodeFirstTokenDate(): Promise<void> {
|
|
try {
|
|
const config = getGlobalConfig()
|
|
|
|
if (config.claudeCodeFirstTokenDate !== undefined) {
|
|
return
|
|
}
|
|
|
|
const authHeaders = getAuthHeaders()
|
|
if (authHeaders.error) {
|
|
logError(new Error(`Failed to get auth headers: ${authHeaders.error}`))
|
|
return
|
|
}
|
|
|
|
const oauthConfig = getOauthConfig()
|
|
const url = `${oauthConfig.BASE_API_URL}/api/organization/claude_code_first_token_date`
|
|
|
|
const response = await axios.get(url, {
|
|
headers: {
|
|
...authHeaders.headers,
|
|
'User-Agent': getClaudeCodeUserAgent(),
|
|
},
|
|
timeout: 10000,
|
|
})
|
|
|
|
const firstTokenDate = response.data?.first_token_date ?? null
|
|
|
|
// Validate the date if it's not null
|
|
if (firstTokenDate !== null) {
|
|
const dateTime = new Date(firstTokenDate).getTime()
|
|
if (isNaN(dateTime)) {
|
|
logError(
|
|
new Error(
|
|
`Received invalid first_token_date from API: ${firstTokenDate}`,
|
|
),
|
|
)
|
|
// Don't save invalid dates
|
|
return
|
|
}
|
|
}
|
|
|
|
saveGlobalConfig(current => ({
|
|
...current,
|
|
claudeCodeFirstTokenDate: firstTokenDate,
|
|
}))
|
|
} catch (error) {
|
|
logError(error)
|
|
}
|
|
}
|