diff --git a/integrations/linear/integration.definition.ts b/integrations/linear/integration.definition.ts index 3f22b91ab3d..8011988a6ef 100644 --- a/integrations/linear/integration.definition.ts +++ b/integrations/linear/integration.definition.ts @@ -9,7 +9,7 @@ import listable from './bp_modules/listable' import { actions, channels, events, configuration, configurations, user, states, entities } from './definitions' export const INTEGRATION_NAME = 'linear' -export const INTEGRATION_VERSION = '2.5.1' +export const INTEGRATION_VERSION = '2.5.2' export default new IntegrationDefinition({ name: INTEGRATION_NAME, diff --git a/integrations/linear/src/misc/linear.ts b/integrations/linear/src/misc/linear.ts index f79a30c2180..02e6135b325 100644 --- a/integrations/linear/src/misc/linear.ts +++ b/integrations/linear/src/misc/linear.ts @@ -318,3 +318,16 @@ export const registerWebhook = async ({ }) logger.forBot().info('Linear webhook registered successfully.') } + +export const revokeToken = async (token: string) => { + const form = new URLSearchParams({ token, token_type_hint: 'access_token' }) + try { + await axios.post(`${linearEndpoint}/oauth/revoke`, form.toString(), { headers: oauthHeaders }) + } catch (err: unknown) { + if (axios.isAxiosError(err)) { + const message = err.response?.data?.error_description || err.message + throw new RuntimeError(`Failed to revoke token: ${message}`) + } + throw new RuntimeError(`Failed to revoke token: ${String(err)}`) + } +} diff --git a/integrations/linear/src/oauth-wizard.ts b/integrations/linear/src/oauth-wizard.ts index c170d9a6543..f79699991d9 100644 --- a/integrations/linear/src/oauth-wizard.ts +++ b/integrations/linear/src/oauth-wizard.ts @@ -14,19 +14,17 @@ const _buildAuthorizeUrl = ({ actor, scopes, state, - promptConsent, }: { clientId: string actor: 'user' | 'app' scopes: string state: string - promptConsent: boolean }) => 'https://linear.app/oauth/authorize' + `?client_id=${clientId}` + `&redirect_uri=${encodeURIComponent(REDIRECT_URI)}` + '&response_type=code' + - (promptConsent ? '&prompt=consent' : '') + + '&prompt=consent' + `&actor=${actor}` + `&state=${state}` + `&scope=${scopes}` @@ -50,7 +48,7 @@ const _startStep: oauthWizard.WizardStepHandler = async ({ ctx, const clientId = isDesk ? bp.secrets.DESK_CLIENT_ID : bp.secrets.CLIENT_ID return responses.redirectToExternalUrl( - _buildAuthorizeUrl({ clientId, actor: 'user', scopes: ADMIN_SCOPES, state: ctx.webhookId, promptConsent: true }) + _buildAuthorizeUrl({ clientId, actor: 'user', scopes: ADMIN_SCOPES, state: ctx.webhookId }) ) } @@ -131,7 +129,6 @@ const _oauthCallbackStep: oauthWizard.WizardStepHandler = async actor: 'app', scopes: APP_SCOPES, state: ctx.webhookId, - promptConsent: false, }) ) } diff --git a/integrations/linear/src/setup.ts b/integrations/linear/src/setup.ts index 91f99059908..d8069f08f88 100644 --- a/integrations/linear/src/setup.ts +++ b/integrations/linear/src/setup.ts @@ -1,5 +1,5 @@ import { RuntimeError } from '@botpress/client' -import { LinearOauthClient, registerWebhook, unregisterWebhook } from './misc/linear' +import { LinearOauthClient, registerWebhook, revokeToken, unregisterWebhook } from './misc/linear' import * as bp from '.botpress' const _isWebhookManuallyRegistered = (ctx: bp.HandlerProps['ctx']) => @@ -41,7 +41,19 @@ export const unregister: bp.IntegrationProps['unregister'] = async ({ client, ct const webhookUrl = `${process.env.BP_WEBHOOK_URL}/${ctx.webhookId}` logger.forBot().info('Unregistering Linear webhook.') await unregisterWebhook({ linearClient, logger, url: webhookUrl }) - logger.forBot().info('Linear webhook unregistration step completed.') + + logger.forBot().info('Revoking Linear access tokens.') + const [{ state: appState }, { state: adminState }] = await Promise.all([ + client.getState({ type: 'integration', name: 'credentials', id: ctx.integrationId }), + client.getState({ type: 'integration', name: 'adminCredentials', id: ctx.integrationId }), + ]) + if (appState.payload.accessToken) { + await revokeToken(appState.payload.accessToken) + } + if (adminState.payload.accessToken) { + await revokeToken(adminState.payload.accessToken) + } + logger.forBot().info('Linear integration unregistration completed.') } catch (thrown) { const errorMessage = thrown instanceof Error ? thrown.message : String(thrown) logger.forBot().warn('Failed to unregister webhook:', errorMessage) diff --git a/package.json b/package.json index a51f22af3da..3b8af5915fb 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@aws-sdk/client-dynamodb": "^3.564.0", - "@botpress/api": "1.105.0", + "@botpress/api": "1.108.0", "@botpress/cli": "workspace:*", "@botpress/client": "workspace:*", "@botpress/sdk": "workspace:*", diff --git a/packages/cli/package.json b/packages/cli/package.json index 6a472a1ede2..931b99fb8ca 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/cli", - "version": "6.8.0", + "version": "6.8.1", "description": "Botpress CLI", "scripts": { "build": "pnpm run build:types && pnpm run bundle && pnpm run template:gen", @@ -27,8 +27,8 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.7.0", "@botpress/chat": "0.5.5", - "@botpress/client": "1.45.0", - "@botpress/sdk": "6.11.0", + "@botpress/client": "1.46.0", + "@botpress/sdk": "6.11.1", "@bpinternal/const": "^0.1.0", "@bpinternal/tunnel": "^0.1.1", "@bpinternal/verel": "^0.2.0", diff --git a/packages/cli/templates/empty-bot/package.json b/packages/cli/templates/empty-bot/package.json index 717c6f44384..ca8e6e5c92a 100644 --- a/packages/cli/templates/empty-bot/package.json +++ b/packages/cli/templates/empty-bot/package.json @@ -5,8 +5,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.45.0", - "@botpress/sdk": "6.11.0" + "@botpress/client": "1.46.0", + "@botpress/sdk": "6.11.1" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/empty-integration/package.json b/packages/cli/templates/empty-integration/package.json index f6ff153d0b8..07e44d7a63e 100644 --- a/packages/cli/templates/empty-integration/package.json +++ b/packages/cli/templates/empty-integration/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.45.0", - "@botpress/sdk": "6.11.0" + "@botpress/client": "1.46.0", + "@botpress/sdk": "6.11.1" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/empty-plugin/package.json b/packages/cli/templates/empty-plugin/package.json index 6f0d2b1c9af..233249525f0 100644 --- a/packages/cli/templates/empty-plugin/package.json +++ b/packages/cli/templates/empty-plugin/package.json @@ -6,7 +6,7 @@ }, "private": true, "dependencies": { - "@botpress/sdk": "6.11.0" + "@botpress/sdk": "6.11.1" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/hello-world/package.json b/packages/cli/templates/hello-world/package.json index 952ea87210b..c76cf0095aa 100644 --- a/packages/cli/templates/hello-world/package.json +++ b/packages/cli/templates/hello-world/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.45.0", - "@botpress/sdk": "6.11.0" + "@botpress/client": "1.46.0", + "@botpress/sdk": "6.11.1" }, "devDependencies": { "@types/node": "^22.16.4", diff --git a/packages/cli/templates/webhook-message/package.json b/packages/cli/templates/webhook-message/package.json index 60192963855..544869e9d4a 100644 --- a/packages/cli/templates/webhook-message/package.json +++ b/packages/cli/templates/webhook-message/package.json @@ -6,8 +6,8 @@ }, "private": true, "dependencies": { - "@botpress/client": "1.45.0", - "@botpress/sdk": "6.11.0", + "@botpress/client": "1.46.0", + "@botpress/sdk": "6.11.1", "axios": "^1.6.8" }, "devDependencies": { diff --git a/packages/client/package.json b/packages/client/package.json index f278a46dcfa..0bf140dfdd8 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/client", - "version": "1.45.0", + "version": "1.46.0", "description": "Botpress Client", "main": "./dist/index.cjs", "module": "./dist/index.mjs", diff --git a/packages/llmz/package.json b/packages/llmz/package.json index bc080d3f6e5..6c899c20de3 100644 --- a/packages/llmz/package.json +++ b/packages/llmz/package.json @@ -2,7 +2,7 @@ "name": "llmz", "type": "module", "description": "LLMz - An LLM-native Typescript VM built on top of Zui", - "version": "0.0.77", + "version": "0.0.78", "types": "./dist/index.d.ts", "main": "./dist/index.cjs", "module": "./dist/index.js", @@ -71,7 +71,7 @@ "tsx": "^4.19.2" }, "peerDependencies": { - "@botpress/client": "1.45.0", + "@botpress/client": "1.46.0", "@botpress/cognitive": "0.5.4", "@bpinternal/thicktoken": "^2.0.0", "@bpinternal/zui": "^2.1.1" diff --git a/packages/sdk/package.json b/packages/sdk/package.json index d738cdeda5c..7e3221c4500 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/sdk", - "version": "6.11.0", + "version": "6.11.1", "description": "Botpress SDK", "main": "./dist/index.cjs", "module": "./dist/index.mjs", @@ -20,7 +20,7 @@ "author": "", "license": "MIT", "dependencies": { - "@botpress/client": "1.45.0", + "@botpress/client": "1.46.0", "browser-or-node": "^2.1.1", "semver": "^7.3.8" }, diff --git a/packages/vai/package.json b/packages/vai/package.json index 3d2c5b2ac39..27f538081ce 100644 --- a/packages/vai/package.json +++ b/packages/vai/package.json @@ -1,6 +1,6 @@ { "name": "@botpress/vai", - "version": "0.0.34", + "version": "0.0.35", "description": "Vitest AI (vai) – a vitest extension for testing with LLMs", "types": "./dist/index.d.ts", "exports": { @@ -40,7 +40,7 @@ "tsup": "^8.0.2" }, "peerDependencies": { - "@botpress/client": "1.45.0", + "@botpress/client": "1.46.0", "@bpinternal/thicktoken": "^1.0.1", "@bpinternal/zui": "^2.1.1", "lodash": "^4.17.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 038c178c658..7b0d1d5718f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ importers: specifier: ^3.564.0 version: 3.709.0 '@botpress/api': - specifier: 1.105.0 - version: 1.105.0 + specifier: 1.108.0 + version: 1.108.0 '@botpress/cli': specifier: workspace:* version: link:packages/cli @@ -2787,10 +2787,10 @@ importers: specifier: 0.5.5 version: link:../chat-client '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../client '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../sdk '@bpinternal/const': specifier: ^0.1.0 @@ -2911,10 +2911,10 @@ importers: packages/cli/templates/empty-bot: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../../../client '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../../../sdk devDependencies: '@types/node': @@ -2927,10 +2927,10 @@ importers: packages/cli/templates/empty-integration: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../../../client '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../../../sdk devDependencies: '@types/node': @@ -2943,7 +2943,7 @@ importers: packages/cli/templates/empty-plugin: dependencies: '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../../../sdk devDependencies: '@types/node': @@ -2956,10 +2956,10 @@ importers: packages/cli/templates/hello-world: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../../../client '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../../../sdk devDependencies: '@types/node': @@ -2972,10 +2972,10 @@ importers: packages/cli/templates/webhook-message: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../../../client '@botpress/sdk': - specifier: 6.11.0 + specifier: 6.11.1 version: link:../../../sdk axios: specifier: ^1.6.8 @@ -3126,7 +3126,7 @@ importers: specifier: ^7.26.3 version: 7.26.9 '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../client '@botpress/cognitive': specifier: 0.5.4 @@ -3232,7 +3232,7 @@ importers: packages/sdk: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../client '@bpinternal/zui': specifier: ^2.1.1 @@ -3269,7 +3269,7 @@ importers: packages/vai: dependencies: '@botpress/client': - specifier: 1.45.0 + specifier: 1.46.0 version: link:../client '@bpinternal/thicktoken': specifier: ^1.0.1 @@ -4299,8 +4299,8 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@botpress/api@1.105.0': - resolution: {integrity: sha512-DnnqYlEyLCXf7cCaPSJvrQHhb+ycRbFPCyCGKTn0y7mvF32n5tgwZUbC4fEtHt/i6u9AuXPG3ObqPjPcYxocLw==} + '@botpress/api@1.108.0': + resolution: {integrity: sha512-8NZATBHQy2s+HkNn4C4yQL1Yti4KMBJrdwzBVqqJfFblnkbFSPfzzkylb3Io+4YAamYTse61nEIYZCtY6a/Jhg==} '@bpinternal/const@0.1.0': resolution: {integrity: sha512-iIQg9oYYXOt+LSK34oNhJVQTcgRdtLmLZirEUaE+R9hnmbKONA5reR2kTewxZmekGyxej+5RtDK9xrC/0hmeAw==} @@ -8336,6 +8336,7 @@ packages: esbuild-plugin-polyfill-node@0.3.0: resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: esbuild: '*' @@ -14246,7 +14247,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@botpress/api@1.105.0': + '@botpress/api@1.108.0': dependencies: '@bpinternal/opapi': 1.0.0(openapi-types@12.1.3) transitivePeerDependencies: