integrate-sdk 0.9.0 → 0.9.3-dev.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"auto-routes.d.ts","sourceRoot":"","sources":["../../../src/adapters/auto-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,GAAG,IAAI,CAEhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AAkBH;;;GAGG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CA+Dd;AAED;;;GAGG;AACH,wBAAsB,GAAG,CACvB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CAoCd"}
1
+ {"version":3,"file":"auto-routes.d.ts","sourceRoot":"","sources":["../../../src/adapters/auto-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,GAAG,IAAI,CAEhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AAkBH;;;GAGG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CAwEd;AAED;;;GAGG;AACH,wBAAsB,GAAG,CACvB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CAoCd"}
@@ -11826,6 +11826,81 @@ class OAuthHandler {
11826
11826
  const data = await response.json();
11827
11827
  return data;
11828
11828
  }
11829
+ async handleRefresh(request) {
11830
+ let webRequest;
11831
+ let refreshRequest;
11832
+ if (request instanceof Request) {
11833
+ webRequest = request;
11834
+ refreshRequest = await request.json();
11835
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
11836
+ refreshRequest = await request.json();
11837
+ } else {
11838
+ refreshRequest = request;
11839
+ }
11840
+ const providerConfig = this.config.providers[refreshRequest.provider];
11841
+ if (!providerConfig) {
11842
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
11843
+ }
11844
+ let context;
11845
+ if (webRequest) {
11846
+ try {
11847
+ if (this.config.getSessionContext) {
11848
+ context = await this.config.getSessionContext(webRequest);
11849
+ }
11850
+ if (!context || !context.userId) {
11851
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
11852
+ context = await detectSessionContext2(webRequest);
11853
+ }
11854
+ } catch (error) {}
11855
+ }
11856
+ const body = {
11857
+ provider: refreshRequest.provider,
11858
+ refresh_token: refreshRequest.refreshToken,
11859
+ client_id: providerConfig.clientId
11860
+ };
11861
+ if (providerConfig.clientSecret) {
11862
+ body.client_secret = providerConfig.clientSecret;
11863
+ }
11864
+ if (providerConfig.config?.subdomain) {
11865
+ body.subdomain = providerConfig.config.subdomain;
11866
+ }
11867
+ const url = new URL("/oauth/refresh", this.serverUrl);
11868
+ const response = await fetch(url.toString(), {
11869
+ method: "POST",
11870
+ headers: this.getHeaders({
11871
+ "Content-Type": "application/json"
11872
+ }),
11873
+ body: JSON.stringify(body)
11874
+ });
11875
+ if (!response.ok) {
11876
+ const error = await response.text();
11877
+ const lowerError = error.toLowerCase();
11878
+ if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
11879
+ throw new Error(`Token refresh not supported: ${error}`);
11880
+ }
11881
+ throw new Error(`Token refresh failed: ${error}`);
11882
+ }
11883
+ const data = await response.json();
11884
+ const result = data;
11885
+ if (this.config.setProviderToken) {
11886
+ try {
11887
+ const tokenData = {
11888
+ accessToken: result.accessToken,
11889
+ refreshToken: result.refreshToken,
11890
+ tokenType: result.tokenType,
11891
+ expiresIn: result.expiresIn,
11892
+ expiresAt: result.expiresAt,
11893
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11894
+ };
11895
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11896
+ if (email) {
11897
+ tokenData.email = email;
11898
+ }
11899
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11900
+ } catch (error) {}
11901
+ }
11902
+ return result;
11903
+ }
11829
11904
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11905
  const url = this.serverUrl;
11831
11906
  const headers = this.getHeaders({
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
11956
12031
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12032
  }
11958
12033
  },
12034
+ async refresh(req) {
12035
+ try {
12036
+ const result = await handler.handleRefresh(req);
12037
+ const response = Response.json(result);
12038
+ if (handler.hasDatabaseCallbacks()) {
12039
+ response.headers.set("X-Integrate-Use-Database", "true");
12040
+ }
12041
+ return response;
12042
+ } catch (error) {
12043
+ if (error.message?.toLowerCase().includes("not supported")) {
12044
+ logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
12045
+ } else {
12046
+ logger33.error("[OAuth Refresh] Error:", error);
12047
+ }
12048
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12049
+ }
12050
+ },
11959
12051
  createRoutes() {
11960
12052
  return {
11961
12053
  async POST(req, context) {
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
11970
12062
  if (action === "disconnect") {
11971
12063
  return handlers.disconnect(req);
11972
12064
  }
12065
+ if (action === "refresh") {
12066
+ return handlers.refresh(req);
12067
+ }
11973
12068
  if (action === "mcp") {
11974
12069
  return handlers.mcp(req);
11975
12070
  }
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
12015
12110
  if (action === "disconnect") {
12016
12111
  return handlers.disconnect(req);
12017
12112
  }
12113
+ if (action === "refresh") {
12114
+ return handlers.refresh(req);
12115
+ }
12018
12116
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12117
  }
12020
12118
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -12138,9 +12236,17 @@ async function POST2(req, context) {
12138
12236
  const result = await handler.handleDisconnect({ provider: body.provider }, accessToken, req);
12139
12237
  return createSuccessResponse(result);
12140
12238
  }
12239
+ if (action === "refresh") {
12240
+ const result = await handler.handleRefresh(req);
12241
+ return createSuccessResponse(result);
12242
+ }
12141
12243
  return createErrorResponse(`Unknown action: ${action}`, 404);
12142
12244
  } catch (error) {
12143
- logger34.error(`[OAuth ${action}] Error:`, error);
12245
+ if (action === "refresh" && error.message?.toLowerCase().includes("not supported")) {
12246
+ logger34.info(`[OAuth ${action}] Not supported for this provider:`, error.message);
12247
+ } else {
12248
+ logger34.error(`[OAuth ${action}] Error:`, error);
12249
+ }
12144
12250
  return createErrorResponse(error.message, 500);
12145
12251
  }
12146
12252
  }
@@ -179,6 +179,25 @@ export interface DisconnectResponse {
179
179
  success: boolean;
180
180
  provider: string;
181
181
  }
182
+ /**
183
+ * Request body for token refresh endpoint
184
+ */
185
+ export interface RefreshRequest {
186
+ provider: string;
187
+ refreshToken: string;
188
+ }
189
+ /**
190
+ * Response from token refresh endpoint
191
+ */
192
+ export interface RefreshResponse {
193
+ accessToken: string;
194
+ refreshToken?: string;
195
+ tokenType: string;
196
+ expiresIn: number;
197
+ expiresAt?: string;
198
+ scopes?: string[];
199
+ email?: string;
200
+ }
182
201
  /**
183
202
  * Request body for MCP tool call endpoint
184
203
  */
@@ -285,6 +304,17 @@ export declare class OAuthHandler {
285
304
  * @throws Error if MCP server request fails
286
305
  */
287
306
  handleDisconnect(request: DisconnectRequest, accessToken: string, webRequest?: Request): Promise<DisconnectResponse>;
307
+ /**
308
+ * Handle token refresh
309
+ * Refreshes an expired access token via the MCP server's /oauth/refresh endpoint
310
+ *
311
+ * @param request - Refresh request with provider and refreshToken, OR full Web Request object
312
+ * @returns Refreshed token data
313
+ *
314
+ * @throws Error if provider is not configured
315
+ * @throws Error if MCP server request fails
316
+ */
317
+ handleRefresh(request: RefreshRequest | Request): Promise<RefreshResponse>;
288
318
  /**
289
319
  * Handle MCP tool call
290
320
  * Forwards tool call requests to MCP server with API key and provider token
@@ -1 +1 @@
1
- {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
@@ -11826,6 +11826,81 @@ class OAuthHandler {
11826
11826
  const data = await response.json();
11827
11827
  return data;
11828
11828
  }
11829
+ async handleRefresh(request) {
11830
+ let webRequest;
11831
+ let refreshRequest;
11832
+ if (request instanceof Request) {
11833
+ webRequest = request;
11834
+ refreshRequest = await request.json();
11835
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
11836
+ refreshRequest = await request.json();
11837
+ } else {
11838
+ refreshRequest = request;
11839
+ }
11840
+ const providerConfig = this.config.providers[refreshRequest.provider];
11841
+ if (!providerConfig) {
11842
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
11843
+ }
11844
+ let context;
11845
+ if (webRequest) {
11846
+ try {
11847
+ if (this.config.getSessionContext) {
11848
+ context = await this.config.getSessionContext(webRequest);
11849
+ }
11850
+ if (!context || !context.userId) {
11851
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
11852
+ context = await detectSessionContext2(webRequest);
11853
+ }
11854
+ } catch (error) {}
11855
+ }
11856
+ const body = {
11857
+ provider: refreshRequest.provider,
11858
+ refresh_token: refreshRequest.refreshToken,
11859
+ client_id: providerConfig.clientId
11860
+ };
11861
+ if (providerConfig.clientSecret) {
11862
+ body.client_secret = providerConfig.clientSecret;
11863
+ }
11864
+ if (providerConfig.config?.subdomain) {
11865
+ body.subdomain = providerConfig.config.subdomain;
11866
+ }
11867
+ const url = new URL("/oauth/refresh", this.serverUrl);
11868
+ const response = await fetch(url.toString(), {
11869
+ method: "POST",
11870
+ headers: this.getHeaders({
11871
+ "Content-Type": "application/json"
11872
+ }),
11873
+ body: JSON.stringify(body)
11874
+ });
11875
+ if (!response.ok) {
11876
+ const error = await response.text();
11877
+ const lowerError = error.toLowerCase();
11878
+ if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
11879
+ throw new Error(`Token refresh not supported: ${error}`);
11880
+ }
11881
+ throw new Error(`Token refresh failed: ${error}`);
11882
+ }
11883
+ const data = await response.json();
11884
+ const result = data;
11885
+ if (this.config.setProviderToken) {
11886
+ try {
11887
+ const tokenData = {
11888
+ accessToken: result.accessToken,
11889
+ refreshToken: result.refreshToken,
11890
+ tokenType: result.tokenType,
11891
+ expiresIn: result.expiresIn,
11892
+ expiresAt: result.expiresAt,
11893
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11894
+ };
11895
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11896
+ if (email) {
11897
+ tokenData.email = email;
11898
+ }
11899
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11900
+ } catch (error) {}
11901
+ }
11902
+ return result;
11903
+ }
11829
11904
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11905
  const url = this.serverUrl;
11831
11906
  const headers = this.getHeaders({
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
11956
12031
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12032
  }
11958
12033
  },
12034
+ async refresh(req) {
12035
+ try {
12036
+ const result = await handler.handleRefresh(req);
12037
+ const response = Response.json(result);
12038
+ if (handler.hasDatabaseCallbacks()) {
12039
+ response.headers.set("X-Integrate-Use-Database", "true");
12040
+ }
12041
+ return response;
12042
+ } catch (error) {
12043
+ if (error.message?.toLowerCase().includes("not supported")) {
12044
+ logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
12045
+ } else {
12046
+ logger33.error("[OAuth Refresh] Error:", error);
12047
+ }
12048
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12049
+ }
12050
+ },
11959
12051
  createRoutes() {
11960
12052
  return {
11961
12053
  async POST(req, context) {
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
11970
12062
  if (action === "disconnect") {
11971
12063
  return handlers.disconnect(req);
11972
12064
  }
12065
+ if (action === "refresh") {
12066
+ return handlers.refresh(req);
12067
+ }
11973
12068
  if (action === "mcp") {
11974
12069
  return handlers.mcp(req);
11975
12070
  }
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
12015
12110
  if (action === "disconnect") {
12016
12111
  return handlers.disconnect(req);
12017
12112
  }
12113
+ if (action === "refresh") {
12114
+ return handlers.refresh(req);
12115
+ }
12018
12116
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12117
  }
12020
12118
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -218,6 +218,22 @@ export declare function createNextOAuthHandler(config: OAuthHandlerConfig): {
218
218
  * ```
219
219
  */
220
220
  disconnect(req: NextRequest): Promise<NextResponse>;
221
+ /**
222
+ * POST /api/integrate/oauth/refresh
223
+ *
224
+ * Refresh an expired access token via the MCP server
225
+ *
226
+ * Request body:
227
+ * ```json
228
+ * {
229
+ * "provider": "github",
230
+ * "refreshToken": "<stored-refresh-token>"
231
+ * }
232
+ * ```
233
+ *
234
+ * Response: Same shape as callback response (accessToken, refreshToken, etc.)
235
+ */
236
+ refresh(req: NextRequest): Promise<NextResponse>;
221
237
  /**
222
238
  * Create unified route handlers for catch-all route
223
239
  *
@@ -324,6 +340,7 @@ export declare function createNextOAuthHandler(config: OAuthHandlerConfig): {
324
340
  * - GET /api/integrate/oauth/callback - Provider OAuth redirect
325
341
  * - GET /api/integrate/oauth/status - Check authorization status
326
342
  * - POST /api/integrate/oauth/disconnect - Disconnect provider
343
+ * - POST /api/integrate/oauth/refresh - Refresh expired token
327
344
  * - POST /api/integrate/mcp - Execute MCP tool calls
328
345
  */
329
346
  toNextJsHandler(redirectConfig?: {
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;QA2BxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;;IAiB5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACY,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;qCAC8B;QAC/B,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;QAKG;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;QAsCxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;;EAqG/B"}
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD;;;;;;;;;;;;;;OAcG;iBACgB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;QA+BxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;;IAiB5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACY,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;qCAC8B;QAC/B,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;QAKG;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;QA0CxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;;EAqG/B"}
@@ -11826,6 +11826,81 @@ class OAuthHandler {
11826
11826
  const data = await response.json();
11827
11827
  return data;
11828
11828
  }
11829
+ async handleRefresh(request) {
11830
+ let webRequest;
11831
+ let refreshRequest;
11832
+ if (request instanceof Request) {
11833
+ webRequest = request;
11834
+ refreshRequest = await request.json();
11835
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
11836
+ refreshRequest = await request.json();
11837
+ } else {
11838
+ refreshRequest = request;
11839
+ }
11840
+ const providerConfig = this.config.providers[refreshRequest.provider];
11841
+ if (!providerConfig) {
11842
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
11843
+ }
11844
+ let context;
11845
+ if (webRequest) {
11846
+ try {
11847
+ if (this.config.getSessionContext) {
11848
+ context = await this.config.getSessionContext(webRequest);
11849
+ }
11850
+ if (!context || !context.userId) {
11851
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
11852
+ context = await detectSessionContext2(webRequest);
11853
+ }
11854
+ } catch (error) {}
11855
+ }
11856
+ const body = {
11857
+ provider: refreshRequest.provider,
11858
+ refresh_token: refreshRequest.refreshToken,
11859
+ client_id: providerConfig.clientId
11860
+ };
11861
+ if (providerConfig.clientSecret) {
11862
+ body.client_secret = providerConfig.clientSecret;
11863
+ }
11864
+ if (providerConfig.config?.subdomain) {
11865
+ body.subdomain = providerConfig.config.subdomain;
11866
+ }
11867
+ const url = new URL("/oauth/refresh", this.serverUrl);
11868
+ const response = await fetch(url.toString(), {
11869
+ method: "POST",
11870
+ headers: this.getHeaders({
11871
+ "Content-Type": "application/json"
11872
+ }),
11873
+ body: JSON.stringify(body)
11874
+ });
11875
+ if (!response.ok) {
11876
+ const error = await response.text();
11877
+ const lowerError = error.toLowerCase();
11878
+ if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
11879
+ throw new Error(`Token refresh not supported: ${error}`);
11880
+ }
11881
+ throw new Error(`Token refresh failed: ${error}`);
11882
+ }
11883
+ const data = await response.json();
11884
+ const result = data;
11885
+ if (this.config.setProviderToken) {
11886
+ try {
11887
+ const tokenData = {
11888
+ accessToken: result.accessToken,
11889
+ refreshToken: result.refreshToken,
11890
+ tokenType: result.tokenType,
11891
+ expiresIn: result.expiresIn,
11892
+ expiresAt: result.expiresAt,
11893
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11894
+ };
11895
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11896
+ if (email) {
11897
+ tokenData.email = email;
11898
+ }
11899
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11900
+ } catch (error) {}
11901
+ }
11902
+ return result;
11903
+ }
11829
11904
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11905
  const url = this.serverUrl;
11831
11906
  const headers = this.getHeaders({
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
11956
12031
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12032
  }
11958
12033
  },
12034
+ async refresh(req) {
12035
+ try {
12036
+ const result = await handler.handleRefresh(req);
12037
+ const response = Response.json(result);
12038
+ if (handler.hasDatabaseCallbacks()) {
12039
+ response.headers.set("X-Integrate-Use-Database", "true");
12040
+ }
12041
+ return response;
12042
+ } catch (error) {
12043
+ if (error.message?.toLowerCase().includes("not supported")) {
12044
+ logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
12045
+ } else {
12046
+ logger33.error("[OAuth Refresh] Error:", error);
12047
+ }
12048
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12049
+ }
12050
+ },
11959
12051
  createRoutes() {
11960
12052
  return {
11961
12053
  async POST(req, context) {
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
11970
12062
  if (action === "disconnect") {
11971
12063
  return handlers.disconnect(req);
11972
12064
  }
12065
+ if (action === "refresh") {
12066
+ return handlers.refresh(req);
12067
+ }
11973
12068
  if (action === "mcp") {
11974
12069
  return handlers.mcp(req);
11975
12070
  }
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
12015
12110
  if (action === "disconnect") {
12016
12111
  return handlers.disconnect(req);
12017
12112
  }
12113
+ if (action === "refresh") {
12114
+ return handlers.refresh(req);
12115
+ }
12018
12116
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12117
  }
12020
12118
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -11826,6 +11826,81 @@ class OAuthHandler {
11826
11826
  const data = await response.json();
11827
11827
  return data;
11828
11828
  }
11829
+ async handleRefresh(request) {
11830
+ let webRequest;
11831
+ let refreshRequest;
11832
+ if (request instanceof Request) {
11833
+ webRequest = request;
11834
+ refreshRequest = await request.json();
11835
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
11836
+ refreshRequest = await request.json();
11837
+ } else {
11838
+ refreshRequest = request;
11839
+ }
11840
+ const providerConfig = this.config.providers[refreshRequest.provider];
11841
+ if (!providerConfig) {
11842
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
11843
+ }
11844
+ let context;
11845
+ if (webRequest) {
11846
+ try {
11847
+ if (this.config.getSessionContext) {
11848
+ context = await this.config.getSessionContext(webRequest);
11849
+ }
11850
+ if (!context || !context.userId) {
11851
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
11852
+ context = await detectSessionContext2(webRequest);
11853
+ }
11854
+ } catch (error) {}
11855
+ }
11856
+ const body = {
11857
+ provider: refreshRequest.provider,
11858
+ refresh_token: refreshRequest.refreshToken,
11859
+ client_id: providerConfig.clientId
11860
+ };
11861
+ if (providerConfig.clientSecret) {
11862
+ body.client_secret = providerConfig.clientSecret;
11863
+ }
11864
+ if (providerConfig.config?.subdomain) {
11865
+ body.subdomain = providerConfig.config.subdomain;
11866
+ }
11867
+ const url = new URL("/oauth/refresh", this.serverUrl);
11868
+ const response = await fetch(url.toString(), {
11869
+ method: "POST",
11870
+ headers: this.getHeaders({
11871
+ "Content-Type": "application/json"
11872
+ }),
11873
+ body: JSON.stringify(body)
11874
+ });
11875
+ if (!response.ok) {
11876
+ const error = await response.text();
11877
+ const lowerError = error.toLowerCase();
11878
+ if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
11879
+ throw new Error(`Token refresh not supported: ${error}`);
11880
+ }
11881
+ throw new Error(`Token refresh failed: ${error}`);
11882
+ }
11883
+ const data = await response.json();
11884
+ const result = data;
11885
+ if (this.config.setProviderToken) {
11886
+ try {
11887
+ const tokenData = {
11888
+ accessToken: result.accessToken,
11889
+ refreshToken: result.refreshToken,
11890
+ tokenType: result.tokenType,
11891
+ expiresIn: result.expiresIn,
11892
+ expiresAt: result.expiresAt,
11893
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11894
+ };
11895
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11896
+ if (email) {
11897
+ tokenData.email = email;
11898
+ }
11899
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11900
+ } catch (error) {}
11901
+ }
11902
+ return result;
11903
+ }
11829
11904
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11905
  const url = this.serverUrl;
11831
11906
  const headers = this.getHeaders({
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
11956
12031
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12032
  }
11958
12033
  },
12034
+ async refresh(req) {
12035
+ try {
12036
+ const result = await handler.handleRefresh(req);
12037
+ const response = Response.json(result);
12038
+ if (handler.hasDatabaseCallbacks()) {
12039
+ response.headers.set("X-Integrate-Use-Database", "true");
12040
+ }
12041
+ return response;
12042
+ } catch (error) {
12043
+ if (error.message?.toLowerCase().includes("not supported")) {
12044
+ logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
12045
+ } else {
12046
+ logger33.error("[OAuth Refresh] Error:", error);
12047
+ }
12048
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12049
+ }
12050
+ },
11959
12051
  createRoutes() {
11960
12052
  return {
11961
12053
  async POST(req, context) {
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
11970
12062
  if (action === "disconnect") {
11971
12063
  return handlers.disconnect(req);
11972
12064
  }
12065
+ if (action === "refresh") {
12066
+ return handlers.refresh(req);
12067
+ }
11973
12068
  if (action === "mcp") {
11974
12069
  return handlers.mcp(req);
11975
12070
  }
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
12015
12110
  if (action === "disconnect") {
12016
12111
  return handlers.disconnect(req);
12017
12112
  }
12113
+ if (action === "refresh") {
12114
+ return handlers.refresh(req);
12115
+ }
12018
12116
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12117
  }
12020
12118
  if (segments.length === 1 && segments[0] === "mcp") {