@merit-systems/echo-next-sdk 0.0.30-test.536e84b4.0 → 0.0.30

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.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CreateOauthTokenResponse, OpenAIProvider, AnthropicProvider, GoogleGenerativeAIProvider, GroqProvider, OpenRouterProvider } from '@merit-systems/echo-typescript-sdk';
1
+ import { CreateOauthTokenResponse, OpenAIProvider, AnthropicProvider, GoogleGenerativeAIProvider, GroqProvider, OpenRouterProvider, XaiProvider } from '@merit-systems/echo-typescript-sdk';
2
2
  import { NextRequest } from 'next/server';
3
3
 
4
4
  interface EchoConfig {
@@ -28,6 +28,7 @@ type EchoResult = {
28
28
  google: GoogleGenerativeAIProvider;
29
29
  groq: GroqProvider;
30
30
  openrouter: OpenRouterProvider;
31
+ xai: XaiProvider;
31
32
  };
32
33
 
33
34
  /**
package/dist/index.js CHANGED
@@ -159,6 +159,14 @@ function createEchoGroq(config) {
159
159
  return createEchoGroqBase(config, async () => getEchoToken(config));
160
160
  }
161
161
 
162
+ // src/ai-providers/xai.ts
163
+ import {
164
+ createEchoXAI as createEchoXAIBase
165
+ } from "@merit-systems/echo-typescript-sdk";
166
+ function createEchoXAI(config) {
167
+ return createEchoXAIBase(config, async () => getEchoToken(config));
168
+ }
169
+
162
170
  // src/index.ts
163
171
  import {
164
172
  validateAppId
@@ -477,7 +485,8 @@ function Echo(config) {
477
485
  anthropic: createEchoAnthropic(config),
478
486
  google: createEchoGoogle(config),
479
487
  groq: createEchoGroq(config),
480
- openrouter: createEchoOpenRouter(config)
488
+ openrouter: createEchoOpenRouter(config),
489
+ xai: createEchoXAI(config)
481
490
  };
482
491
  }
483
492
  export {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ai-providers/anthropic.ts","../src/auth/token-manager.ts","../src/config.ts","../src/auth/cookie-names.ts","../src/auth/jwt-utils.ts","../src/ai-providers/google.ts","../src/ai-providers/openai.ts","../src/ai-providers/openrouter.ts","../src/ai-providers/groq.ts","../src/proxy/index.ts","../src/auth/oauth-handlers.ts"],"sourcesContent":["import { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\n\nimport { EchoConfig, EchoResult } from './types';\n\nimport { createEchoAnthropic } from 'ai-providers/anthropic';\nimport { createEchoGoogle } from 'ai-providers/google';\nimport { createEchoOpenAI } from 'ai-providers/openai';\nimport { createEchoOpenRouter } from 'ai-providers/openrouter';\nimport { createEchoGroq } from 'ai-providers/groq';\n\nimport {\n CreateOauthTokenResponse,\n validateAppId,\n} from '@merit-systems/echo-typescript-sdk';\n\nimport { ECHO_COOKIE, namespacedCookie } from 'auth/cookie-names';\nimport { getEchoToken as getEchoTokenInternal } from 'auth/token-manager';\nimport { handleEchoClientProxy } from 'proxy';\nimport {\n handleCallback,\n handleRefresh,\n handleSession,\n handleSignIn,\n handleSignOut,\n} from './auth/oauth-handlers';\n\n/**\n * Echo SDK for Next.js\n * Provides OAuth authentication and token management for Echo API integration\n */\nexport default function Echo(config: EchoConfig): EchoResult {\n validateAppId(config.appId, 'Echo');\n /**\n * HTTP handler for OAuth routes (signin and callback)\n */\n const httpHandler = async (req: NextRequest): Promise<Response> => {\n const { pathname } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n const path = pathname.replace(basePath, '');\n\n if (path.startsWith('/proxy')) {\n return handleEchoClientProxy(req, config);\n }\n\n switch (path) {\n // all the auth stuff\n case '/signin':\n return handleSignIn(req, config);\n\n case '/signout':\n return handleSignOut(req, config);\n\n case '/callback':\n return handleCallback(req, config);\n\n case '/refresh':\n return handleRefresh(req, config);\n\n case '/session':\n return handleSession(req, config);\n\n default:\n console.error('Unknown path', path);\n return NextResponse.error();\n }\n };\n\n /**\n * Get current user info with automatic token refresh\n */\n const getUser = async () => {\n // read only access token, if expired we are fucked\n const cookieStore = await cookies();\n const userInfo = cookieStore.get(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n )?.value;\n if (!userInfo) {\n return null;\n }\n const user = JSON.parse(userInfo) as CreateOauthTokenResponse['user'];\n return user;\n };\n\n const isSignedIn = async () => {\n const cookieStore = await cookies();\n const refreshTokenExpiry = cookieStore.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n )?.value;\n\n if (!refreshTokenExpiry) {\n return false; // No expiry stored\n }\n\n const expiryTime = parseInt(refreshTokenExpiry);\n const now = Math.floor(Date.now() / 1000);\n\n return expiryTime > now; // True if not expired\n };\n\n return {\n // HTTP handlers for Next.js API routes\n handlers: {\n GET: httpHandler,\n POST: httpHandler,\n },\n\n // Authentication utilities (server-side only)\n getUser,\n isSignedIn,\n getEchoToken: () => getEchoTokenInternal(config),\n\n // AI provider clients\n openai: createEchoOpenAI(config),\n anthropic: createEchoAnthropic(config),\n google: createEchoGoogle(config),\n groq: createEchoGroq(config),\n openrouter: createEchoOpenRouter(config),\n };\n}\n","import {\n AnthropicProvider,\n createEchoAnthropic as createEchoAnthropicBase,\n EchoConfig,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoAnthropic(config: EchoConfig): AnthropicProvider {\n return createEchoAnthropicBase(config, async () => getEchoToken(config));\n}\n","import {\n EchoClient,\n EchoConfig,\n CreateOauthTokenResponse,\n} from '@merit-systems/echo-typescript-sdk';\nimport { cookies as getCookies } from 'next/headers';\nimport { resolveEchoBaseUrl } from '../config';\nimport { ECHO_COOKIE, namespacedCookie } from './cookie-names';\nimport { shouldRefreshToken } from './jwt-utils';\n\n/**\n * Refresh an access token using a refresh token\n * @param refreshToken - The refresh token to use\n * @param appId - The Echo app ID\n * @returns Promise resolving to the new token data\n */\nexport async function performTokenRefresh(\n refreshToken: string,\n config: EchoConfig\n): Promise<CreateOauthTokenResponse> {\n return fetch(`${resolveEchoBaseUrl(config)}/api/oauth/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: config.appId,\n }),\n }).then(async r => {\n if (r.ok) {\n const tokenData = (await r.json()) as CreateOauthTokenResponse;\n return tokenData;\n }\n return Promise.reject(new Error(await r.text()));\n });\n}\n\n/**\n * Get a valid Echo token, refreshing if necessary\n * @param appId - The Echo app ID for token refresh\n * @returns Promise resolving to a valid access token or null if authentication failed\n */\nexport async function getEchoToken(config: EchoConfig): Promise<string | null> {\n const cookies = await getCookies();\n const accessToken = cookies.get(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId)\n )?.value;\n\n // Check if token needs refresh\n if (!accessToken || shouldRefreshToken(accessToken)) {\n const refreshToken = cookies.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId)\n )?.value;\n\n if (!refreshToken) {\n console.log('No refresh token found');\n return null;\n }\n\n try {\n const refreshResult = await performTokenRefresh(refreshToken, config);\n\n // Set new tokens in cookies\n cookies.set(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId),\n refreshResult.access_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.expires_in,\n path: '/',\n }\n );\n\n cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId),\n refreshResult.refresh_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.refresh_token_expires_in,\n path: '/',\n }\n );\n\n // Store refresh token expiry time for checking\n cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId),\n String(\n Math.floor(Date.now() / 1000) + refreshResult.refresh_token_expires_in\n ),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.refresh_token_expires_in,\n path: '/',\n }\n );\n\n return refreshResult.access_token;\n } catch (error) {\n console.error('Token refresh failed:', refreshToken, error);\n return null;\n }\n }\n\n return accessToken;\n}\n\nexport async function getUser(config: EchoConfig) {\n const echo = await getEchoClient(config);\n if (!echo) {\n throw new Error('User not signed in');\n }\n return echo.users.getUserInfo();\n}\n\nexport async function getEchoClient(\n config: EchoConfig\n): Promise<EchoClient | null> {\n const token = await getEchoToken(config);\n if (!token) {\n return null;\n }\n return new EchoClient({\n baseUrl: resolveEchoBaseUrl(config),\n apiKey: token,\n });\n}\n","import { ECHO_BASE_URL } from '@merit-systems/echo-typescript-sdk';\nimport type { EchoConfig } from './types';\n\nexport function resolveEchoBaseUrl(config: EchoConfig): string {\n return config.baseEchoUrl || ECHO_BASE_URL;\n}\n","export const ECHO_COOKIE = {\n ACCESS_TOKEN: 'echo_access_token',\n REFRESH_TOKEN: 'echo_refresh_token',\n REFRESH_TOKEN_EXPIRES: 'echo_refresh_token_expires',\n USER_INFO: 'echo_user_info',\n CODE_VERIFIER: 'echo_code_verifier',\n} as const;\n\nexport type EchoCookieName = (typeof ECHO_COOKIE)[keyof typeof ECHO_COOKIE];\n\nexport function namespacedCookie(name: EchoCookieName, appId: string): string {\n // Ensure consistent delimiter and avoid accidental double underscores\n return `${name}_${appId}`;\n}\n","import { jwtDecode } from 'jwt-decode';\n\ninterface JwtPayload {\n exp?: number;\n}\n\n/**\n * Check if a JWT token needs to be refreshed\n * @param token - The JWT access token to check\n * @returns true if token should be refreshed, false otherwise\n */\nexport function shouldRefreshToken(token: string): boolean {\n try {\n const decoded = jwtDecode<JwtPayload>(token);\n if (!decoded.exp) return true;\n\n const now = Math.floor(Date.now() / 1000);\n // Refresh if token expires within 30 seconds\n const bufferTime = 30;\n return decoded.exp <= now + bufferTime;\n } catch {\n return true; // If we can't decode, assume it needs refresh\n }\n}\n","import {\n createEchoGoogle as createEchoGoogleBase,\n EchoConfig,\n GoogleGenerativeAIProvider,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoGoogle(\n config: EchoConfig\n): GoogleGenerativeAIProvider {\n return createEchoGoogleBase(config, async () => getEchoToken(config));\n}\n","import { getEchoToken } from '../auth/token-manager';\nimport {\n createEchoOpenAI as createEchoOpenAIBase,\n EchoConfig,\n OpenAIProvider,\n} from '@merit-systems/echo-typescript-sdk';\n\nexport function createEchoOpenAI(config: EchoConfig): OpenAIProvider {\n return createEchoOpenAIBase(config, async () => getEchoToken(config));\n}\n","import { getEchoToken } from '../auth/token-manager';\nimport {\n createEchoOpenRouter as createEchoOpenRouterBase,\n EchoConfig,\n OpenRouterProvider,\n} from '@merit-systems/echo-typescript-sdk';\n\nexport function createEchoOpenRouter(config: EchoConfig): OpenRouterProvider {\n return createEchoOpenRouterBase(config, async () => getEchoToken(config));\n}\n","import {\n createEchoGroq as createEchoGroqBase,\n EchoConfig,\n GroqProvider,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoGroq(config: EchoConfig): GroqProvider {\n return createEchoGroqBase(config, async () => getEchoToken(config));\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { getEchoToken } from '../auth/token-manager';\nimport { EchoConfig } from '../types';\n/**\n * Proxy requests to Echo service with automatic authentication\n */\nexport async function handleEchoClientProxy(\n req: NextRequest,\n config: EchoConfig\n): Promise<Response> {\n const proxyPath = req.nextUrl.pathname.replace(/^.*\\/proxy/, '');\n const baseUrl = config.baseEchoUrl || 'https://echo.merit.systems';\n const targetUrl = `${baseUrl}${proxyPath}`;\n\n const headers = new Headers(req.headers);\n headers.delete('host');\n // Don't ask upstream to compress\n headers.delete('accept-encoding');\n headers.set('accept-encoding', 'identity');\n\n // Optional: also drop conditional headers to avoid weirdness\n headers.delete('if-none-match');\n headers.delete('if-modified-since');\n\n // Get valid token using existing function (handles refresh automatically)\n const accessToken = await getEchoToken(config);\n\n if (!accessToken) {\n return NextResponse.json(\n { error: 'Authentication required' },\n { status: 401 }\n );\n }\n // Inject the valid token\n headers.set('Authorization', `Bearer ${accessToken}`);\n try {\n const response = await fetch(targetUrl, {\n method: req.method,\n headers,\n ...(req.method !== 'GET' &&\n req.method !== 'HEAD' && {\n body: req.body,\n duplex: 'half',\n }),\n });\n\n return response;\n } catch (error) {\n console.error('Proxy request failed:', error);\n return NextResponse.json(\n { error: 'Proxy request failed' },\n { status: 500 }\n );\n }\n}\n","import {\n EchoConfig,\n CreateOauthTokenResponse,\n} from '@merit-systems/echo-typescript-sdk';\nimport { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { resolveEchoBaseUrl } from '../config';\nimport { ECHO_COOKIE, namespacedCookie } from './cookie-names';\nimport { getEchoToken } from './token-manager';\n\n/**\n * Generate PKCE code challenge and verifier\n * @returns Object containing code verifier and challenge\n */\nasync function generateCodeChallenge(): Promise<{\n codeVerifier: string;\n codeChallenge: string;\n}> {\n const codeVerifier = Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n const encoder = new TextEncoder();\n const codeChallengeBuffer = await crypto.subtle.digest(\n 'SHA-256',\n encoder.encode(codeVerifier)\n );\n\n const codeChallenge = btoa(\n String.fromCharCode(...new Uint8Array(codeChallengeBuffer))\n )\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n return { codeVerifier, codeChallenge };\n}\n\n/**\n * Handle OAuth signin request - redirect to Echo authorization server\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n * @returns NextResponse with redirect to authorization server\n */\nexport async function handleSignIn(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n\n const baseUrl = resolveEchoBaseUrl(config);\n\n const redirectUrl = new URL(`${baseUrl}/api/oauth/authorize`);\n redirectUrl.searchParams.set('client_id', config.appId);\n redirectUrl.searchParams.set('redirect_uri', `${origin}${basePath}/callback`);\n redirectUrl.searchParams.set('response_type', 'code');\n\n const { codeVerifier, codeChallenge } = await generateCodeChallenge();\n\n redirectUrl.searchParams.set('code_challenge', codeChallenge);\n redirectUrl.searchParams.set('code_challenge_method', 'S256');\n\n // Create response with redirect and set cookie for code verifier\n const response = NextResponse.redirect(redirectUrl.toString());\n\n // Set the code verifier in a secure cookie that will be available during callback\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n codeVerifier,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 300, // 5 minutes - same as auth code TTL\n path: '/',\n }\n );\n\n return response;\n}\n\n/**\n * Handle OAuth signout request - redirect to home page and clear cookies\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n * @returns NextResponse with redirect to home page and cookies cleared\n */\nexport async function handleSignOut(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const response = NextResponse.redirect(`${origin}`);\n\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n );\n\n return response;\n}\n\n/**\n * Handle OAuth callback - exchange authorization code for tokens\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n\n response.cookies.set('echo_access_token', '', {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0,\n path: '/',\n });\n * @returns NextResponse with redirect to home page and tokens set as cookies\n */\nexport async function handleCallback(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n\n // Check for OAuth error parameters first (e.g., when user cancels authorization)\n const error = req.nextUrl.searchParams.get('error');\n const errorDescription = req.nextUrl.searchParams.get('error_description');\n\n if (error) {\n // User cancelled or authorization failed - redirect back to app with error info\n const redirectUrl = new URL(origin);\n redirectUrl.searchParams.set('auth_error', error);\n if (errorDescription) {\n redirectUrl.searchParams.set('auth_error_description', errorDescription);\n }\n\n const response = NextResponse.redirect(redirectUrl.toString());\n\n // Clear the code verifier cookie\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n '',\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0, // Expire immediately\n path: '/',\n }\n );\n\n return response;\n }\n\n const code = req.nextUrl.searchParams.get('code');\n const state = req.nextUrl.searchParams.get('state');\n\n if (!code || !state) {\n return NextResponse.json({ error: 'Invalid request' }, { status: 400 });\n }\n\n // Retrieve the code verifier from the cookie\n const codeVerifier = req.cookies.get(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId)\n )?.value;\n\n if (!codeVerifier) {\n return NextResponse.json(\n { error: 'Code verifier not found. Please try signing in again.' },\n { status: 400 }\n );\n }\n\n // Exchange the code for a token from the token endpoint\n const tokenEndpoint = `${resolveEchoBaseUrl(config)}/api/oauth/token`;\n\n const params = new URLSearchParams();\n params.set('grant_type', 'authorization_code');\n params.set('code', code);\n params.set('redirect_uri', `${origin}${basePath}/callback`);\n params.set('client_id', config.appId);\n params.set('code_verifier', codeVerifier);\n\n const tokenResponse = await fetch(tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'x-client-user-agent': req.headers.get('user-agent') || '',\n 'x-client-ip':\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() || '',\n },\n body: params.toString(),\n });\n\n if (!tokenResponse.ok) {\n return NextResponse.json(\n { error: 'Token exchange failed' },\n { status: 500 }\n );\n }\n\n const tokenData = (await tokenResponse.json()) as CreateOauthTokenResponse;\n\n const response = NextResponse.redirect(`${origin}`);\n\n // Clear the code verifier cookie after successful token exchange\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n '',\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0, // Expire immediately\n path: '/',\n }\n );\n\n // Set the access token as a cookie\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId),\n tokenData.access_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.expires_in, // expires_in is typically in seconds\n path: '/',\n }\n );\n\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId),\n tokenData.refresh_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId),\n JSON.stringify(tokenData.user),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n // Store refresh token expiry time for checking\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId),\n String(Math.floor(Date.now() / 1000) + tokenData.refresh_token_expires_in),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n return response;\n}\n\nexport async function handleRefresh(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n try {\n const token = await getEchoToken(config);\n if (!token) {\n return NextResponse.json({ error: 'No token found' }, { status: 401 });\n }\n\n return NextResponse.json({ success: true });\n } catch (error) {\n console.error('Error refreshing token:', error);\n return NextResponse.json(\n { error: 'Error refreshing token' },\n { status: 500 }\n );\n }\n}\n\nexport async function handleSession(req: NextRequest, config: EchoConfig) {\n const jar = await cookies();\n const refreshExp = jar.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n )?.value;\n const isAuthenticated =\n !!refreshExp && Number(refreshExp) > Math.floor(Date.now() / 1000);\n const userInfo = jar.get(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n )?.value;\n const user = userInfo ? JSON.parse(userInfo) : null;\n return NextResponse.json({ isAuthenticated, user });\n}\n"],"mappings":"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","names":["cookies","NextResponse","cookies","NextResponse","NextResponse","response","NextResponse","cookies"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ai-providers/anthropic.ts","../src/auth/token-manager.ts","../src/config.ts","../src/auth/cookie-names.ts","../src/auth/jwt-utils.ts","../src/ai-providers/google.ts","../src/ai-providers/openai.ts","../src/ai-providers/openrouter.ts","../src/ai-providers/groq.ts","../src/ai-providers/xai.ts","../src/proxy/index.ts","../src/auth/oauth-handlers.ts"],"sourcesContent":["import { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\n\nimport { EchoConfig, EchoResult } from './types';\n\nimport { createEchoAnthropic } from 'ai-providers/anthropic';\nimport { createEchoGoogle } from 'ai-providers/google';\nimport { createEchoOpenAI } from 'ai-providers/openai';\nimport { createEchoOpenRouter } from 'ai-providers/openrouter';\nimport { createEchoGroq } from 'ai-providers/groq';\nimport { createEchoXAI } from 'ai-providers/xai';\n\nimport {\n CreateOauthTokenResponse,\n validateAppId,\n} from '@merit-systems/echo-typescript-sdk';\n\nimport { ECHO_COOKIE, namespacedCookie } from 'auth/cookie-names';\nimport { getEchoToken as getEchoTokenInternal } from 'auth/token-manager';\nimport { handleEchoClientProxy } from 'proxy';\nimport {\n handleCallback,\n handleRefresh,\n handleSession,\n handleSignIn,\n handleSignOut,\n} from './auth/oauth-handlers';\n\n/**\n * Echo SDK for Next.js\n * Provides OAuth authentication and token management for Echo API integration\n */\nexport default function Echo(config: EchoConfig): EchoResult {\n validateAppId(config.appId, 'Echo');\n /**\n * HTTP handler for OAuth routes (signin and callback)\n */\n const httpHandler = async (req: NextRequest): Promise<Response> => {\n const { pathname } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n const path = pathname.replace(basePath, '');\n\n if (path.startsWith('/proxy')) {\n return handleEchoClientProxy(req, config);\n }\n\n switch (path) {\n // all the auth stuff\n case '/signin':\n return handleSignIn(req, config);\n\n case '/signout':\n return handleSignOut(req, config);\n\n case '/callback':\n return handleCallback(req, config);\n\n case '/refresh':\n return handleRefresh(req, config);\n\n case '/session':\n return handleSession(req, config);\n\n default:\n console.error('Unknown path', path);\n return NextResponse.error();\n }\n };\n\n /**\n * Get current user info with automatic token refresh\n */\n const getUser = async () => {\n // read only access token, if expired we are fucked\n const cookieStore = await cookies();\n const userInfo = cookieStore.get(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n )?.value;\n if (!userInfo) {\n return null;\n }\n const user = JSON.parse(userInfo) as CreateOauthTokenResponse['user'];\n return user;\n };\n\n const isSignedIn = async () => {\n const cookieStore = await cookies();\n const refreshTokenExpiry = cookieStore.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n )?.value;\n\n if (!refreshTokenExpiry) {\n return false; // No expiry stored\n }\n\n const expiryTime = parseInt(refreshTokenExpiry);\n const now = Math.floor(Date.now() / 1000);\n\n return expiryTime > now; // True if not expired\n };\n\n return {\n // HTTP handlers for Next.js API routes\n handlers: {\n GET: httpHandler,\n POST: httpHandler,\n },\n\n // Authentication utilities (server-side only)\n getUser,\n isSignedIn,\n getEchoToken: () => getEchoTokenInternal(config),\n\n // AI provider clients\n openai: createEchoOpenAI(config),\n anthropic: createEchoAnthropic(config),\n google: createEchoGoogle(config),\n groq: createEchoGroq(config),\n openrouter: createEchoOpenRouter(config),\n xai: createEchoXAI(config),\n };\n}\n","import {\n AnthropicProvider,\n createEchoAnthropic as createEchoAnthropicBase,\n EchoConfig,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoAnthropic(config: EchoConfig): AnthropicProvider {\n return createEchoAnthropicBase(config, async () => getEchoToken(config));\n}\n","import {\n EchoClient,\n EchoConfig,\n CreateOauthTokenResponse,\n} from '@merit-systems/echo-typescript-sdk';\nimport { cookies as getCookies } from 'next/headers';\nimport { resolveEchoBaseUrl } from '../config';\nimport { ECHO_COOKIE, namespacedCookie } from './cookie-names';\nimport { shouldRefreshToken } from './jwt-utils';\n\n/**\n * Refresh an access token using a refresh token\n * @param refreshToken - The refresh token to use\n * @param appId - The Echo app ID\n * @returns Promise resolving to the new token data\n */\nexport async function performTokenRefresh(\n refreshToken: string,\n config: EchoConfig\n): Promise<CreateOauthTokenResponse> {\n return fetch(`${resolveEchoBaseUrl(config)}/api/oauth/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: config.appId,\n }),\n }).then(async r => {\n if (r.ok) {\n const tokenData = (await r.json()) as CreateOauthTokenResponse;\n return tokenData;\n }\n return Promise.reject(new Error(await r.text()));\n });\n}\n\n/**\n * Get a valid Echo token, refreshing if necessary\n * @param appId - The Echo app ID for token refresh\n * @returns Promise resolving to a valid access token or null if authentication failed\n */\nexport async function getEchoToken(config: EchoConfig): Promise<string | null> {\n const cookies = await getCookies();\n const accessToken = cookies.get(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId)\n )?.value;\n\n // Check if token needs refresh\n if (!accessToken || shouldRefreshToken(accessToken)) {\n const refreshToken = cookies.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId)\n )?.value;\n\n if (!refreshToken) {\n console.log('No refresh token found');\n return null;\n }\n\n try {\n const refreshResult = await performTokenRefresh(refreshToken, config);\n\n // Set new tokens in cookies\n cookies.set(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId),\n refreshResult.access_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.expires_in,\n path: '/',\n }\n );\n\n cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId),\n refreshResult.refresh_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.refresh_token_expires_in,\n path: '/',\n }\n );\n\n // Store refresh token expiry time for checking\n cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId),\n String(\n Math.floor(Date.now() / 1000) + refreshResult.refresh_token_expires_in\n ),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: refreshResult.refresh_token_expires_in,\n path: '/',\n }\n );\n\n return refreshResult.access_token;\n } catch (error) {\n console.error('Token refresh failed:', refreshToken, error);\n return null;\n }\n }\n\n return accessToken;\n}\n\nexport async function getUser(config: EchoConfig) {\n const echo = await getEchoClient(config);\n if (!echo) {\n throw new Error('User not signed in');\n }\n return echo.users.getUserInfo();\n}\n\nexport async function getEchoClient(\n config: EchoConfig\n): Promise<EchoClient | null> {\n const token = await getEchoToken(config);\n if (!token) {\n return null;\n }\n return new EchoClient({\n baseUrl: resolveEchoBaseUrl(config),\n apiKey: token,\n });\n}\n","import { ECHO_BASE_URL } from '@merit-systems/echo-typescript-sdk';\nimport type { EchoConfig } from './types';\n\nexport function resolveEchoBaseUrl(config: EchoConfig): string {\n return config.baseEchoUrl || ECHO_BASE_URL;\n}\n","export const ECHO_COOKIE = {\n ACCESS_TOKEN: 'echo_access_token',\n REFRESH_TOKEN: 'echo_refresh_token',\n REFRESH_TOKEN_EXPIRES: 'echo_refresh_token_expires',\n USER_INFO: 'echo_user_info',\n CODE_VERIFIER: 'echo_code_verifier',\n} as const;\n\nexport type EchoCookieName = (typeof ECHO_COOKIE)[keyof typeof ECHO_COOKIE];\n\nexport function namespacedCookie(name: EchoCookieName, appId: string): string {\n // Ensure consistent delimiter and avoid accidental double underscores\n return `${name}_${appId}`;\n}\n","import { jwtDecode } from 'jwt-decode';\n\ninterface JwtPayload {\n exp?: number;\n}\n\n/**\n * Check if a JWT token needs to be refreshed\n * @param token - The JWT access token to check\n * @returns true if token should be refreshed, false otherwise\n */\nexport function shouldRefreshToken(token: string): boolean {\n try {\n const decoded = jwtDecode<JwtPayload>(token);\n if (!decoded.exp) return true;\n\n const now = Math.floor(Date.now() / 1000);\n // Refresh if token expires within 30 seconds\n const bufferTime = 30;\n return decoded.exp <= now + bufferTime;\n } catch {\n return true; // If we can't decode, assume it needs refresh\n }\n}\n","import {\n createEchoGoogle as createEchoGoogleBase,\n EchoConfig,\n GoogleGenerativeAIProvider,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoGoogle(\n config: EchoConfig\n): GoogleGenerativeAIProvider {\n return createEchoGoogleBase(config, async () => getEchoToken(config));\n}\n","import { getEchoToken } from '../auth/token-manager';\nimport {\n createEchoOpenAI as createEchoOpenAIBase,\n EchoConfig,\n OpenAIProvider,\n} from '@merit-systems/echo-typescript-sdk';\n\nexport function createEchoOpenAI(config: EchoConfig): OpenAIProvider {\n return createEchoOpenAIBase(config, async () => getEchoToken(config));\n}\n","import { getEchoToken } from '../auth/token-manager';\nimport {\n createEchoOpenRouter as createEchoOpenRouterBase,\n EchoConfig,\n OpenRouterProvider,\n} from '@merit-systems/echo-typescript-sdk';\n\nexport function createEchoOpenRouter(config: EchoConfig): OpenRouterProvider {\n return createEchoOpenRouterBase(config, async () => getEchoToken(config));\n}\n","import {\n createEchoGroq as createEchoGroqBase,\n EchoConfig,\n GroqProvider,\n} from '@merit-systems/echo-typescript-sdk';\nimport { getEchoToken } from '../auth/token-manager';\n\nexport function createEchoGroq(config: EchoConfig): GroqProvider {\n return createEchoGroqBase(config, async () => getEchoToken(config));\n}\n","import { getEchoToken } from '../auth/token-manager';\nimport {\n createEchoXAI as createEchoXAIBase,\n EchoConfig,\n XaiProvider,\n} from '@merit-systems/echo-typescript-sdk';\n\nexport function createEchoXAI(config: EchoConfig): XaiProvider {\n return createEchoXAIBase(config, async () => getEchoToken(config));\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { getEchoToken } from '../auth/token-manager';\nimport { EchoConfig } from '../types';\n/**\n * Proxy requests to Echo service with automatic authentication\n */\nexport async function handleEchoClientProxy(\n req: NextRequest,\n config: EchoConfig\n): Promise<Response> {\n const proxyPath = req.nextUrl.pathname.replace(/^.*\\/proxy/, '');\n const baseUrl = config.baseEchoUrl || 'https://echo.merit.systems';\n const targetUrl = `${baseUrl}${proxyPath}`;\n\n const headers = new Headers(req.headers);\n headers.delete('host');\n // Don't ask upstream to compress\n headers.delete('accept-encoding');\n headers.set('accept-encoding', 'identity');\n\n // Optional: also drop conditional headers to avoid weirdness\n headers.delete('if-none-match');\n headers.delete('if-modified-since');\n\n // Get valid token using existing function (handles refresh automatically)\n const accessToken = await getEchoToken(config);\n\n if (!accessToken) {\n return NextResponse.json(\n { error: 'Authentication required' },\n { status: 401 }\n );\n }\n // Inject the valid token\n headers.set('Authorization', `Bearer ${accessToken}`);\n try {\n const response = await fetch(targetUrl, {\n method: req.method,\n headers,\n ...(req.method !== 'GET' &&\n req.method !== 'HEAD' && {\n body: req.body,\n duplex: 'half',\n }),\n });\n\n return response;\n } catch (error) {\n console.error('Proxy request failed:', error);\n return NextResponse.json(\n { error: 'Proxy request failed' },\n { status: 500 }\n );\n }\n}\n","import {\n EchoConfig,\n CreateOauthTokenResponse,\n} from '@merit-systems/echo-typescript-sdk';\nimport { cookies } from 'next/headers';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { resolveEchoBaseUrl } from '../config';\nimport { ECHO_COOKIE, namespacedCookie } from './cookie-names';\nimport { getEchoToken } from './token-manager';\n\n/**\n * Generate PKCE code challenge and verifier\n * @returns Object containing code verifier and challenge\n */\nasync function generateCodeChallenge(): Promise<{\n codeVerifier: string;\n codeChallenge: string;\n}> {\n const codeVerifier = Array.from(crypto.getRandomValues(new Uint8Array(32)))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n const encoder = new TextEncoder();\n const codeChallengeBuffer = await crypto.subtle.digest(\n 'SHA-256',\n encoder.encode(codeVerifier)\n );\n\n const codeChallenge = btoa(\n String.fromCharCode(...new Uint8Array(codeChallengeBuffer))\n )\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n return { codeVerifier, codeChallenge };\n}\n\n/**\n * Handle OAuth signin request - redirect to Echo authorization server\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n * @returns NextResponse with redirect to authorization server\n */\nexport async function handleSignIn(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n\n const baseUrl = resolveEchoBaseUrl(config);\n\n const redirectUrl = new URL(`${baseUrl}/api/oauth/authorize`);\n redirectUrl.searchParams.set('client_id', config.appId);\n redirectUrl.searchParams.set('redirect_uri', `${origin}${basePath}/callback`);\n redirectUrl.searchParams.set('response_type', 'code');\n\n const { codeVerifier, codeChallenge } = await generateCodeChallenge();\n\n redirectUrl.searchParams.set('code_challenge', codeChallenge);\n redirectUrl.searchParams.set('code_challenge_method', 'S256');\n\n // Create response with redirect and set cookie for code verifier\n const response = NextResponse.redirect(redirectUrl.toString());\n\n // Set the code verifier in a secure cookie that will be available during callback\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n codeVerifier,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 300, // 5 minutes - same as auth code TTL\n path: '/',\n }\n );\n\n return response;\n}\n\n/**\n * Handle OAuth signout request - redirect to home page and clear cookies\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n * @returns NextResponse with redirect to home page and cookies cleared\n */\nexport async function handleSignOut(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const response = NextResponse.redirect(`${origin}`);\n\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n );\n response.cookies.delete(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n );\n\n return response;\n}\n\n/**\n * Handle OAuth callback - exchange authorization code for tokens\n * @param req - The incoming Next.js request\n * @param config - Echo configuration\n\n response.cookies.set('echo_access_token', '', {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0,\n path: '/',\n });\n * @returns NextResponse with redirect to home page and tokens set as cookies\n */\nexport async function handleCallback(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n const { origin } = req.nextUrl;\n const basePath = config.basePath || '/api/echo';\n\n // Check for OAuth error parameters first (e.g., when user cancels authorization)\n const error = req.nextUrl.searchParams.get('error');\n const errorDescription = req.nextUrl.searchParams.get('error_description');\n\n if (error) {\n // User cancelled or authorization failed - redirect back to app with error info\n const redirectUrl = new URL(origin);\n redirectUrl.searchParams.set('auth_error', error);\n if (errorDescription) {\n redirectUrl.searchParams.set('auth_error_description', errorDescription);\n }\n\n const response = NextResponse.redirect(redirectUrl.toString());\n\n // Clear the code verifier cookie\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n '',\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0, // Expire immediately\n path: '/',\n }\n );\n\n return response;\n }\n\n const code = req.nextUrl.searchParams.get('code');\n const state = req.nextUrl.searchParams.get('state');\n\n if (!code || !state) {\n return NextResponse.json({ error: 'Invalid request' }, { status: 400 });\n }\n\n // Retrieve the code verifier from the cookie\n const codeVerifier = req.cookies.get(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId)\n )?.value;\n\n if (!codeVerifier) {\n return NextResponse.json(\n { error: 'Code verifier not found. Please try signing in again.' },\n { status: 400 }\n );\n }\n\n // Exchange the code for a token from the token endpoint\n const tokenEndpoint = `${resolveEchoBaseUrl(config)}/api/oauth/token`;\n\n const params = new URLSearchParams();\n params.set('grant_type', 'authorization_code');\n params.set('code', code);\n params.set('redirect_uri', `${origin}${basePath}/callback`);\n params.set('client_id', config.appId);\n params.set('code_verifier', codeVerifier);\n\n const tokenResponse = await fetch(tokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'x-client-user-agent': req.headers.get('user-agent') || '',\n 'x-client-ip':\n req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() || '',\n },\n body: params.toString(),\n });\n\n if (!tokenResponse.ok) {\n return NextResponse.json(\n { error: 'Token exchange failed' },\n { status: 500 }\n );\n }\n\n const tokenData = (await tokenResponse.json()) as CreateOauthTokenResponse;\n\n const response = NextResponse.redirect(`${origin}`);\n\n // Clear the code verifier cookie after successful token exchange\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.CODE_VERIFIER, config.appId),\n '',\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 0, // Expire immediately\n path: '/',\n }\n );\n\n // Set the access token as a cookie\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.ACCESS_TOKEN, config.appId),\n tokenData.access_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.expires_in, // expires_in is typically in seconds\n path: '/',\n }\n );\n\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN, config.appId),\n tokenData.refresh_token,\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId),\n JSON.stringify(tokenData.user),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n // Store refresh token expiry time for checking\n response.cookies.set(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId),\n String(Math.floor(Date.now() / 1000) + tokenData.refresh_token_expires_in),\n {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: tokenData.refresh_token_expires_in,\n path: '/',\n }\n );\n\n return response;\n}\n\nexport async function handleRefresh(\n req: NextRequest,\n config: EchoConfig\n): Promise<NextResponse> {\n try {\n const token = await getEchoToken(config);\n if (!token) {\n return NextResponse.json({ error: 'No token found' }, { status: 401 });\n }\n\n return NextResponse.json({ success: true });\n } catch (error) {\n console.error('Error refreshing token:', error);\n return NextResponse.json(\n { error: 'Error refreshing token' },\n { status: 500 }\n );\n }\n}\n\nexport async function handleSession(req: NextRequest, config: EchoConfig) {\n const jar = await cookies();\n const refreshExp = jar.get(\n namespacedCookie(ECHO_COOKIE.REFRESH_TOKEN_EXPIRES, config.appId)\n )?.value;\n const isAuthenticated =\n !!refreshExp && Number(refreshExp) > Math.floor(Date.now() / 1000);\n const userInfo = jar.get(\n namespacedCookie(ECHO_COOKIE.USER_INFO, config.appId)\n )?.value;\n const user = userInfo ? JSON.parse(userInfo) : null;\n return NextResponse.json({ isAuthenticated, user });\n}\n"],"mappings":"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","names":["cookies","NextResponse","cookies","NextResponse","NextResponse","response","NextResponse","cookies"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@merit-systems/echo-next-sdk",
3
- "version": "0.0.30-test.536e84b4.0",
3
+ "version": "0.0.30",
4
4
  "description": "Next.js SDK for Echo",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,8 +27,8 @@
27
27
  "ai": "^5.0.17",
28
28
  "jwt-decode": "^4.0.0",
29
29
  "swr": "^2.3.1",
30
- "@merit-systems/echo-typescript-sdk": "1.0.23-test.536e84b4.0",
31
- "@merit-systems/echo-react-sdk": "1.0.39-test.536e84b4.0"
30
+ "@merit-systems/echo-typescript-sdk": "1.0.23",
31
+ "@merit-systems/echo-react-sdk": "1.0.39"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "next": ">=15.0.0",