integrate-sdk 0.9.0 → 0.9.2-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,CAoEd;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,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -12138,6 +12228,10 @@ async function POST2(req, context) {
12138
12228
  const result = await handler.handleDisconnect({ provider: body.provider }, accessToken, req);
12139
12229
  return createSuccessResponse(result);
12140
12230
  }
12231
+ if (action === "refresh") {
12232
+ const result = await handler.handleRefresh(req);
12233
+ return createSuccessResponse(result);
12234
+ }
12141
12235
  return createErrorResponse(`Unknown action: ${action}`, 404);
12142
12236
  } catch (error) {
12143
12237
  logger34.error(`[OAuth ${action}] Error:`, error);
@@ -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,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  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;IAoBtD;;;;;;;;;;;;;;;;;;;;;;;;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,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -11826,6 +11826,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -11826,6 +11826,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -11826,6 +11826,77 @@ 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
+ throw new Error(`Token refresh failed: ${error}`);
11878
+ }
11879
+ const data = await response.json();
11880
+ const result = data;
11881
+ if (this.config.setProviderToken) {
11882
+ try {
11883
+ const tokenData = {
11884
+ accessToken: result.accessToken,
11885
+ refreshToken: result.refreshToken,
11886
+ tokenType: result.tokenType,
11887
+ expiresIn: result.expiresIn,
11888
+ expiresAt: result.expiresAt,
11889
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11890
+ };
11891
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
11892
+ if (email) {
11893
+ tokenData.email = email;
11894
+ }
11895
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
11896
+ } catch (error) {}
11897
+ }
11898
+ return result;
11899
+ }
11829
11900
  async handleToolCall(request, authHeader, integrationsHeader) {
11830
11901
  const url = this.serverUrl;
11831
11902
  const headers = this.getHeaders({
@@ -11956,6 +12027,19 @@ function createNextOAuthHandler(config) {
11956
12027
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11957
12028
  }
11958
12029
  },
12030
+ async refresh(req) {
12031
+ try {
12032
+ const result = await handler.handleRefresh(req);
12033
+ const response = Response.json(result);
12034
+ if (handler.hasDatabaseCallbacks()) {
12035
+ response.headers.set("X-Integrate-Use-Database", "true");
12036
+ }
12037
+ return response;
12038
+ } catch (error) {
12039
+ logger33.error("[OAuth Refresh] Error:", error);
12040
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
12041
+ }
12042
+ },
11959
12043
  createRoutes() {
11960
12044
  return {
11961
12045
  async POST(req, context) {
@@ -11970,6 +12054,9 @@ function createNextOAuthHandler(config) {
11970
12054
  if (action === "disconnect") {
11971
12055
  return handlers.disconnect(req);
11972
12056
  }
12057
+ if (action === "refresh") {
12058
+ return handlers.refresh(req);
12059
+ }
11973
12060
  if (action === "mcp") {
11974
12061
  return handlers.mcp(req);
11975
12062
  }
@@ -12015,6 +12102,9 @@ function createNextOAuthHandler(config) {
12015
12102
  if (action === "disconnect") {
12016
12103
  return handlers.disconnect(req);
12017
12104
  }
12105
+ if (action === "refresh") {
12106
+ return handlers.refresh(req);
12107
+ }
12018
12108
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
12019
12109
  }
12020
12110
  if (segments.length === 1 && segments[0] === "mcp") {
package/dist/index.js CHANGED
@@ -2817,6 +2817,19 @@ function createNextOAuthHandler(config) {
2817
2817
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
2818
2818
  }
2819
2819
  },
2820
+ async refresh(req) {
2821
+ try {
2822
+ const result = await handler.handleRefresh(req);
2823
+ const response = Response.json(result);
2824
+ if (handler.hasDatabaseCallbacks()) {
2825
+ response.headers.set("X-Integrate-Use-Database", "true");
2826
+ }
2827
+ return response;
2828
+ } catch (error) {
2829
+ logger6.error("[OAuth Refresh] Error:", error);
2830
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
2831
+ }
2832
+ },
2820
2833
  createRoutes() {
2821
2834
  return {
2822
2835
  async POST(req, context) {
@@ -2831,6 +2844,9 @@ function createNextOAuthHandler(config) {
2831
2844
  if (action === "disconnect") {
2832
2845
  return handlers.disconnect(req);
2833
2846
  }
2847
+ if (action === "refresh") {
2848
+ return handlers.refresh(req);
2849
+ }
2834
2850
  if (action === "mcp") {
2835
2851
  return handlers.mcp(req);
2836
2852
  }
@@ -2876,6 +2892,9 @@ function createNextOAuthHandler(config) {
2876
2892
  if (action === "disconnect") {
2877
2893
  return handlers.disconnect(req);
2878
2894
  }
2895
+ if (action === "refresh") {
2896
+ return handlers.refresh(req);
2897
+ }
2879
2898
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
2880
2899
  }
2881
2900
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -12205,6 +12224,77 @@ class OAuthHandler {
12205
12224
  const data = await response.json();
12206
12225
  return data;
12207
12226
  }
12227
+ async handleRefresh(request) {
12228
+ let webRequest;
12229
+ let refreshRequest;
12230
+ if (request instanceof Request) {
12231
+ webRequest = request;
12232
+ refreshRequest = await request.json();
12233
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
12234
+ refreshRequest = await request.json();
12235
+ } else {
12236
+ refreshRequest = request;
12237
+ }
12238
+ const providerConfig = this.config.providers[refreshRequest.provider];
12239
+ if (!providerConfig) {
12240
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
12241
+ }
12242
+ let context;
12243
+ if (webRequest) {
12244
+ try {
12245
+ if (this.config.getSessionContext) {
12246
+ context = await this.config.getSessionContext(webRequest);
12247
+ }
12248
+ if (!context || !context.userId) {
12249
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
12250
+ context = await detectSessionContext2(webRequest);
12251
+ }
12252
+ } catch (error) {}
12253
+ }
12254
+ const body = {
12255
+ provider: refreshRequest.provider,
12256
+ refresh_token: refreshRequest.refreshToken,
12257
+ client_id: providerConfig.clientId
12258
+ };
12259
+ if (providerConfig.clientSecret) {
12260
+ body.client_secret = providerConfig.clientSecret;
12261
+ }
12262
+ if (providerConfig.config?.subdomain) {
12263
+ body.subdomain = providerConfig.config.subdomain;
12264
+ }
12265
+ const url = new URL("/oauth/refresh", this.serverUrl);
12266
+ const response = await fetch(url.toString(), {
12267
+ method: "POST",
12268
+ headers: this.getHeaders({
12269
+ "Content-Type": "application/json"
12270
+ }),
12271
+ body: JSON.stringify(body)
12272
+ });
12273
+ if (!response.ok) {
12274
+ const error = await response.text();
12275
+ throw new Error(`Token refresh failed: ${error}`);
12276
+ }
12277
+ const data = await response.json();
12278
+ const result = data;
12279
+ if (this.config.setProviderToken) {
12280
+ try {
12281
+ const tokenData = {
12282
+ accessToken: result.accessToken,
12283
+ refreshToken: result.refreshToken,
12284
+ tokenType: result.tokenType,
12285
+ expiresIn: result.expiresIn,
12286
+ expiresAt: result.expiresAt,
12287
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
12288
+ };
12289
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
12290
+ if (email) {
12291
+ tokenData.email = email;
12292
+ }
12293
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
12294
+ } catch (error) {}
12295
+ }
12296
+ return result;
12297
+ }
12208
12298
  async handleToolCall(request, authHeader, integrationsHeader) {
12209
12299
  const url = this.serverUrl;
12210
12300
  const headers = this.getHeaders({
package/dist/oauth.js CHANGED
@@ -2639,6 +2639,19 @@ function createNextOAuthHandler(config) {
2639
2639
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
2640
2640
  }
2641
2641
  },
2642
+ async refresh(req) {
2643
+ try {
2644
+ const result = await handler.handleRefresh(req);
2645
+ const response = Response.json(result);
2646
+ if (handler.hasDatabaseCallbacks()) {
2647
+ response.headers.set("X-Integrate-Use-Database", "true");
2648
+ }
2649
+ return response;
2650
+ } catch (error) {
2651
+ logger6.error("[OAuth Refresh] Error:", error);
2652
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
2653
+ }
2654
+ },
2642
2655
  createRoutes() {
2643
2656
  return {
2644
2657
  async POST(req, context) {
@@ -2653,6 +2666,9 @@ function createNextOAuthHandler(config) {
2653
2666
  if (action === "disconnect") {
2654
2667
  return handlers.disconnect(req);
2655
2668
  }
2669
+ if (action === "refresh") {
2670
+ return handlers.refresh(req);
2671
+ }
2656
2672
  if (action === "mcp") {
2657
2673
  return handlers.mcp(req);
2658
2674
  }
@@ -2698,6 +2714,9 @@ function createNextOAuthHandler(config) {
2698
2714
  if (action === "disconnect") {
2699
2715
  return handlers.disconnect(req);
2700
2716
  }
2717
+ if (action === "refresh") {
2718
+ return handlers.refresh(req);
2719
+ }
2701
2720
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
2702
2721
  }
2703
2722
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -12039,6 +12058,77 @@ class OAuthHandler {
12039
12058
  const data = await response.json();
12040
12059
  return data;
12041
12060
  }
12061
+ async handleRefresh(request) {
12062
+ let webRequest;
12063
+ let refreshRequest;
12064
+ if (request instanceof Request) {
12065
+ webRequest = request;
12066
+ refreshRequest = await request.json();
12067
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
12068
+ refreshRequest = await request.json();
12069
+ } else {
12070
+ refreshRequest = request;
12071
+ }
12072
+ const providerConfig = this.config.providers[refreshRequest.provider];
12073
+ if (!providerConfig) {
12074
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
12075
+ }
12076
+ let context;
12077
+ if (webRequest) {
12078
+ try {
12079
+ if (this.config.getSessionContext) {
12080
+ context = await this.config.getSessionContext(webRequest);
12081
+ }
12082
+ if (!context || !context.userId) {
12083
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
12084
+ context = await detectSessionContext2(webRequest);
12085
+ }
12086
+ } catch (error) {}
12087
+ }
12088
+ const body = {
12089
+ provider: refreshRequest.provider,
12090
+ refresh_token: refreshRequest.refreshToken,
12091
+ client_id: providerConfig.clientId
12092
+ };
12093
+ if (providerConfig.clientSecret) {
12094
+ body.client_secret = providerConfig.clientSecret;
12095
+ }
12096
+ if (providerConfig.config?.subdomain) {
12097
+ body.subdomain = providerConfig.config.subdomain;
12098
+ }
12099
+ const url = new URL("/oauth/refresh", this.serverUrl);
12100
+ const response = await fetch(url.toString(), {
12101
+ method: "POST",
12102
+ headers: this.getHeaders({
12103
+ "Content-Type": "application/json"
12104
+ }),
12105
+ body: JSON.stringify(body)
12106
+ });
12107
+ if (!response.ok) {
12108
+ const error = await response.text();
12109
+ throw new Error(`Token refresh failed: ${error}`);
12110
+ }
12111
+ const data = await response.json();
12112
+ const result = data;
12113
+ if (this.config.setProviderToken) {
12114
+ try {
12115
+ const tokenData = {
12116
+ accessToken: result.accessToken,
12117
+ refreshToken: result.refreshToken,
12118
+ tokenType: result.tokenType,
12119
+ expiresIn: result.expiresIn,
12120
+ expiresAt: result.expiresAt,
12121
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
12122
+ };
12123
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
12124
+ if (email) {
12125
+ tokenData.email = email;
12126
+ }
12127
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
12128
+ } catch (error) {}
12129
+ }
12130
+ return result;
12131
+ }
12042
12132
  async handleToolCall(request, authHeader, integrationsHeader) {
12043
12133
  const url = this.serverUrl;
12044
12134
  const headers = this.getHeaders({
@@ -12132,6 +12222,10 @@ async function POST2(req, context) {
12132
12222
  const result = await handler.handleDisconnect({ provider: body.provider }, accessToken, req);
12133
12223
  return createSuccessResponse(result);
12134
12224
  }
12225
+ if (action === "refresh") {
12226
+ const result = await handler.handleRefresh(req);
12227
+ return createSuccessResponse(result);
12228
+ }
12135
12229
  return createErrorResponse(`Unknown action: ${action}`, 404);
12136
12230
  } catch (error) {
12137
12231
  logger34.error(`[OAuth ${action}] Error:`, error);
package/dist/server.js CHANGED
@@ -3114,6 +3114,77 @@ class OAuthHandler {
3114
3114
  const data = await response.json();
3115
3115
  return data;
3116
3116
  }
3117
+ async handleRefresh(request) {
3118
+ let webRequest;
3119
+ let refreshRequest;
3120
+ if (request instanceof Request) {
3121
+ webRequest = request;
3122
+ refreshRequest = await request.json();
3123
+ } else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
3124
+ refreshRequest = await request.json();
3125
+ } else {
3126
+ refreshRequest = request;
3127
+ }
3128
+ const providerConfig = this.config.providers[refreshRequest.provider];
3129
+ if (!providerConfig) {
3130
+ throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
3131
+ }
3132
+ let context;
3133
+ if (webRequest) {
3134
+ try {
3135
+ if (this.config.getSessionContext) {
3136
+ context = await this.config.getSessionContext(webRequest);
3137
+ }
3138
+ if (!context || !context.userId) {
3139
+ const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
3140
+ context = await detectSessionContext2(webRequest);
3141
+ }
3142
+ } catch (error) {}
3143
+ }
3144
+ const body = {
3145
+ provider: refreshRequest.provider,
3146
+ refresh_token: refreshRequest.refreshToken,
3147
+ client_id: providerConfig.clientId
3148
+ };
3149
+ if (providerConfig.clientSecret) {
3150
+ body.client_secret = providerConfig.clientSecret;
3151
+ }
3152
+ if (providerConfig.config?.subdomain) {
3153
+ body.subdomain = providerConfig.config.subdomain;
3154
+ }
3155
+ const url = new URL("/oauth/refresh", this.serverUrl);
3156
+ const response = await fetch(url.toString(), {
3157
+ method: "POST",
3158
+ headers: this.getHeaders({
3159
+ "Content-Type": "application/json"
3160
+ }),
3161
+ body: JSON.stringify(body)
3162
+ });
3163
+ if (!response.ok) {
3164
+ const error = await response.text();
3165
+ throw new Error(`Token refresh failed: ${error}`);
3166
+ }
3167
+ const data = await response.json();
3168
+ const result = data;
3169
+ if (this.config.setProviderToken) {
3170
+ try {
3171
+ const tokenData = {
3172
+ accessToken: result.accessToken,
3173
+ refreshToken: result.refreshToken,
3174
+ tokenType: result.tokenType,
3175
+ expiresIn: result.expiresIn,
3176
+ expiresAt: result.expiresAt,
3177
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
3178
+ };
3179
+ const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
3180
+ if (email) {
3181
+ tokenData.email = email;
3182
+ }
3183
+ await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
3184
+ } catch (error) {}
3185
+ }
3186
+ return result;
3187
+ }
3117
3188
  async handleToolCall(request, authHeader, integrationsHeader) {
3118
3189
  const url = this.serverUrl;
3119
3190
  const headers = this.getHeaders({
@@ -3244,6 +3315,19 @@ function createNextOAuthHandler(config) {
3244
3315
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
3245
3316
  }
3246
3317
  },
3318
+ async refresh(req) {
3319
+ try {
3320
+ const result = await handler.handleRefresh(req);
3321
+ const response = Response.json(result);
3322
+ if (handler.hasDatabaseCallbacks()) {
3323
+ response.headers.set("X-Integrate-Use-Database", "true");
3324
+ }
3325
+ return response;
3326
+ } catch (error) {
3327
+ logger7.error("[OAuth Refresh] Error:", error);
3328
+ return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
3329
+ }
3330
+ },
3247
3331
  createRoutes() {
3248
3332
  return {
3249
3333
  async POST(req, context) {
@@ -3258,6 +3342,9 @@ function createNextOAuthHandler(config) {
3258
3342
  if (action === "disconnect") {
3259
3343
  return handlers.disconnect(req);
3260
3344
  }
3345
+ if (action === "refresh") {
3346
+ return handlers.refresh(req);
3347
+ }
3261
3348
  if (action === "mcp") {
3262
3349
  return handlers.mcp(req);
3263
3350
  }
@@ -3303,6 +3390,9 @@ function createNextOAuthHandler(config) {
3303
3390
  if (action === "disconnect") {
3304
3391
  return handlers.disconnect(req);
3305
3392
  }
3393
+ if (action === "refresh") {
3394
+ return handlers.refresh(req);
3395
+ }
3306
3396
  return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
3307
3397
  }
3308
3398
  if (segments.length === 1 && segments[0] === "mcp") {
@@ -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,CAoEd;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"}
@@ -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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"}
@@ -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;IAoBtD;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "integrate-sdk",
3
- "version": "0.9.0",
3
+ "version": "0.9.2-dev.0",
4
4
  "description": "Type-safe 3rd party integration SDK for the Integrate MCP server",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",