63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import Letta from "@letta-ai/letta-client";
|
|
import { LETTA_CLOUD_API_URL, refreshAccessToken } from "../auth/oauth";
|
|
import { settingsManager } from "../settings-manager";
|
|
|
|
export async function getClient() {
|
|
const settings = settingsManager.getSettings();
|
|
|
|
let apiKey = process.env.LETTA_API_KEY || settings.env?.LETTA_API_KEY;
|
|
|
|
// Check if token is expired and refresh if needed
|
|
if (
|
|
!process.env.LETTA_API_KEY &&
|
|
settings.tokenExpiresAt &&
|
|
settings.refreshToken
|
|
) {
|
|
const now = Date.now();
|
|
const expiresAt = settings.tokenExpiresAt;
|
|
|
|
// Refresh if token expires within 5 minutes
|
|
if (expiresAt - now < 5 * 60 * 1000) {
|
|
try {
|
|
const tokens = await refreshAccessToken(settings.refreshToken);
|
|
|
|
// Update settings with new token
|
|
const updatedEnv = { ...settings.env };
|
|
updatedEnv.LETTA_API_KEY = tokens.access_token;
|
|
|
|
settingsManager.updateSettings({
|
|
env: updatedEnv,
|
|
refreshToken: tokens.refresh_token || settings.refreshToken,
|
|
tokenExpiresAt: now + tokens.expires_in * 1000,
|
|
});
|
|
|
|
apiKey = tokens.access_token;
|
|
} catch (error) {
|
|
console.error("Failed to refresh access token:", error);
|
|
console.error("Please run 'letta login' to re-authenticate");
|
|
process.exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check if refresh token is missing for Letta Cloud
|
|
const baseURL =
|
|
process.env.LETTA_BASE_URL ||
|
|
settings.env?.LETTA_BASE_URL ||
|
|
LETTA_CLOUD_API_URL;
|
|
|
|
if (!apiKey && baseURL === LETTA_CLOUD_API_URL) {
|
|
console.error("Missing LETTA_API_KEY");
|
|
console.error(
|
|
"Run 'letta setup' to configure authentication or set your LETTA_API_KEY environment variable",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
return new Letta({
|
|
apiKey,
|
|
baseURL,
|
|
defaultHeaders: { "X-Letta-Source": "letta-code" },
|
|
});
|
|
}
|