From e851ebc9a391894d49698b06a5ba701ec771457b Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Thu, 19 Feb 2026 19:03:21 -0700 Subject: [PATCH 01/23] add version header for cloud requests --- apps/studio/src/lib/cloud/CloudClient.ts | 4 +++- apps/studio/src/store/modules/CredentialsModule.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/studio/src/lib/cloud/CloudClient.ts b/apps/studio/src/lib/cloud/CloudClient.ts index bc7574e8b..18c6a5666 100644 --- a/apps/studio/src/lib/cloud/CloudClient.ts +++ b/apps/studio/src/lib/cloud/CloudClient.ts @@ -35,6 +35,7 @@ const camelCaseData: AxiosResponseTransformer = (data) => { export interface CloudClientOptions { token: string, app: string, + clientVersion: string, email: string baseUrl: string, workspace?: number @@ -85,7 +86,8 @@ export class CloudClient { headers: { email: options.email, token: options.token, - app: options.app + app: options.app, + clientVersion: options.clientVersion, }, validateStatus: (status) => status < 500 }) diff --git a/apps/studio/src/store/modules/CredentialsModule.ts b/apps/studio/src/store/modules/CredentialsModule.ts index f5ec311d7..9c17a0a51 100644 --- a/apps/studio/src/store/modules/CredentialsModule.ts +++ b/apps/studio/src/store/modules/CredentialsModule.ts @@ -31,7 +31,7 @@ interface State { async function credentialToBlob(c: TransportCloudCredential): Promise { const clientOptions: CloudClientOptions = { - app: c.appId, email: c.email, token: c.token, baseUrl: window.platformInfo.cloudUrl + app: c.appId, email: c.email, token: c.token, baseUrl: window.platformInfo.cloudUrl, version: window.platformInfo.appVersion } const client = new CloudClient(clientOptions) try { From ffabca3e2a2802156f6e57af0a858dd2e957b6ae Mon Sep 17 00:00:00 2001 From: Mohammad Azmi Date: Fri, 20 Feb 2026 17:32:59 +0700 Subject: [PATCH 02/23] log mountIframe error in IsolatedPluginView --- apps/studio/src/components/plugins/IsolatedPluginView.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/studio/src/components/plugins/IsolatedPluginView.vue b/apps/studio/src/components/plugins/IsolatedPluginView.vue index dbf44ad54..3fc6f48eb 100644 --- a/apps/studio/src/components/plugins/IsolatedPluginView.vue +++ b/apps/studio/src/components/plugins/IsolatedPluginView.vue @@ -68,6 +68,7 @@ export default Vue.extend({ await this.$nextTick(); if (this.shouldMountIframe) { this.mountIframe().catch((e) => { + log.error(e); this.error = e instanceof Error ? e.message : String(e); }); } else { From fcc0739ee947a82344c4ecb23213a493236bd3e3 Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Fri, 20 Feb 2026 14:37:58 -0700 Subject: [PATCH 03/23] update type --- apps/studio/src/store/modules/CredentialsModule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/src/store/modules/CredentialsModule.ts b/apps/studio/src/store/modules/CredentialsModule.ts index 9c17a0a51..6cb4c7c8f 100644 --- a/apps/studio/src/store/modules/CredentialsModule.ts +++ b/apps/studio/src/store/modules/CredentialsModule.ts @@ -31,7 +31,7 @@ interface State { async function credentialToBlob(c: TransportCloudCredential): Promise { const clientOptions: CloudClientOptions = { - app: c.appId, email: c.email, token: c.token, baseUrl: window.platformInfo.cloudUrl, version: window.platformInfo.appVersion + app: c.appId, email: c.email, token: c.token, baseUrl: window.platformInfo.cloudUrl, clientVersion: window.platformInfo.appVersion } const client = new CloudClient(clientOptions) try { From fb033a939a50095fce69cf65f4a02a74dde1022c Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 13:42:23 -0700 Subject: [PATCH 04/23] fix az cli not found --- apps/studio/src/components/connection/CommonEntraId.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/studio/src/components/connection/CommonEntraId.vue b/apps/studio/src/components/connection/CommonEntraId.vue index c90bd682f..0717cc9b1 100644 --- a/apps/studio/src/components/connection/CommonEntraId.vue +++ b/apps/studio/src/components/connection/CommonEntraId.vue @@ -215,14 +215,14 @@ export default { try { const result = await this.$util.send('backup/whichDumpTool', {toolName: "az"}); if (result) { - this.config.azureAuthOptions.cliPath = result; + this.$set(this.config.azureAuthOptions, 'cliPath', result); this.cliError = false; } else { - this.config.azureAuthOptions.cliPath = null; + this.$set(this.config.azureAuthOptions, 'cliPath', null); this.cliError = true; } } catch (e) { - this.config.azureAuthOptions.cliPath = null; + this.$set(this.config.azureAuthOptions, 'cliPath', null); this.cliError = true; } } From 2adcc57b0a5db2dd5c466a7c7db2307332133719 Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 15:13:16 -0700 Subject: [PATCH 05/23] chore: bump version to 5.6.0-beta.4 --- apps/studio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 99dd37560..87cd9f5bc 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -1,6 +1,6 @@ { "name": "beekeeper-studio", - "version": "5.6.0-beta.3", + "version": "5.6.0-beta.4", "private": true, "description": "An easy-to use SQL query editor and database UI for Mac, Windows, and Linux", "author": { From ee22d39980b6104579f3a14b0c7bbd20a87a153a Mon Sep 17 00:00:00 2001 From: Matthew Rathbone Date: Fri, 20 Feb 2026 08:55:25 -0600 Subject: [PATCH 06/23] fix workflow with zfs commands --- .github/workflows/studio-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/studio-publish.yml b/.github/workflows/studio-publish.yml index 6ceeeaeff..2944de6d1 100644 --- a/.github/workflows/studio-publish.yml +++ b/.github/workflows/studio-publish.yml @@ -105,8 +105,8 @@ jobs: # Why does it fill up zfs? I don't understand what it does at all - name: Free Up ZFS Space run: | - sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy {} - sudo zfs list -H -o name | grep "snapcraft" | xargs -I{} sudo zfs destroy {} + sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy -r {} + sudo zfs list -H -o name | grep "snapcraft" | xargs -I{} sudo zfs destroy -r {} if: matrix.os.clean_zfs - name: Install flatpak tools From 14b372fa98a0d1df512879dcd335001b75302894 Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 16:25:51 -0700 Subject: [PATCH 07/23] chore: bump version to 5.6.0-beta.5 --- apps/studio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 87cd9f5bc..02fb9f38e 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -1,6 +1,6 @@ { "name": "beekeeper-studio", - "version": "5.6.0-beta.4", + "version": "5.6.0-beta.5", "private": true, "description": "An easy-to use SQL query editor and database UI for Mac, Windows, and Linux", "author": { From 17216041b4b1d8ed08124977162fc4ee5ad0250a Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 16:47:37 -0700 Subject: [PATCH 08/23] this better fix zfs --- .github/workflows/studio-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/studio-publish.yml b/.github/workflows/studio-publish.yml index 2944de6d1..041bfcc68 100644 --- a/.github/workflows/studio-publish.yml +++ b/.github/workflows/studio-publish.yml @@ -105,8 +105,8 @@ jobs: # Why does it fill up zfs? I don't understand what it does at all - name: Free Up ZFS Space run: | - sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy -r {} - sudo zfs list -H -o name | grep "snapcraft" | xargs -I{} sudo zfs destroy -r {} + sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy -rR {} + sudo zfs list -H -o name | grep "snapcraft" | xargs -I{} sudo zfs destroy -rR {} if: matrix.os.clean_zfs - name: Install flatpak tools From 5cfb59e4719345011073b9123c852cb13b4a1494 Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 16:48:19 -0700 Subject: [PATCH 09/23] chore: bump version to 5.6.0-beta.6 --- apps/studio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index 02fb9f38e..fe1b3c277 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -1,6 +1,6 @@ { "name": "beekeeper-studio", - "version": "5.6.0-beta.5", + "version": "5.6.0-beta.6", "private": true, "description": "An easy-to use SQL query editor and database UI for Mac, Windows, and Linux", "author": { From d2855752a98cab98c071a3dd62c443c253341b92 Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 17:00:20 -0700 Subject: [PATCH 10/23] I am going to lose it --- .github/workflows/studio-publish.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/studio-publish.yml b/.github/workflows/studio-publish.yml index 041bfcc68..1db81dfce 100644 --- a/.github/workflows/studio-publish.yml +++ b/.github/workflows/studio-publish.yml @@ -105,8 +105,12 @@ jobs: # Why does it fill up zfs? I don't understand what it does at all - name: Free Up ZFS Space run: | - sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy -rR {} - sudo zfs list -H -o name | grep "snapcraft" | xargs -I{} sudo zfs destroy -rR {} + # Force unmount any snapcraft-related ZFS datasets that are busy + sudo zfs list -H -o name | grep "snapcraft" | sort -r | xargs -I{} sudo zfs unmount -f {} 2>/dev/null || true + # Destroy datasets (clones) first, deepest children first + sudo zfs list -H -o name | grep "snapcraft" | sort -r | xargs -I{} sudo zfs destroy -rR {} 2>/dev/null || true + # Then destroy any remaining snapshots + sudo zfs list -H -o name -t snapshot | grep "snapcraft" | xargs -I{} sudo zfs destroy -rR {} 2>/dev/null || true if: matrix.os.clean_zfs - name: Install flatpak tools From 49f4bd93cefcfdd418cb7c4a604357f96a5a616e Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Mon, 23 Feb 2026 17:00:36 -0700 Subject: [PATCH 11/23] chore: bump version to 5.6.0-beta.7 --- apps/studio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/package.json b/apps/studio/package.json index fe1b3c277..6e79eeadb 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -1,6 +1,6 @@ { "name": "beekeeper-studio", - "version": "5.6.0-beta.6", + "version": "5.6.0-beta.7", "private": true, "description": "An easy-to use SQL query editor and database UI for Mac, Windows, and Linux", "author": { From 889d9b81d83eec3052e8571590d6a9688b52d6b2 Mon Sep 17 00:00:00 2001 From: ThiagoCComelli Date: Mon, 23 Feb 2026 21:38:14 -0300 Subject: [PATCH 12/23] Fix pinned tables being duplicated in the UI --- .../core/table_list/VirtualTableList.vue | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue b/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue index d4414a131..6c81ceb1d 100644 --- a/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue +++ b/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue @@ -111,11 +111,15 @@ export default Vue.extend({ if (item.expanded) { expandedMap.set(item.key, true); } + if (item.pinned) { + pinnedMap.set(item.key, true); + } } } for (const pin of this.pins) { - pinnedMap.set(pin.entity, pin); + const key = entityId(pin.schemaName, pin.entity); + pinnedMap.set(key, true); } this.schemaTables.forEach((schema: any) => { @@ -153,7 +157,7 @@ export default Vue.extend({ contextMenu: this.tableMenuOptions, parent, level: noFolder ? 0 : 1, - pinned: pinnedMap.get(table) || false, + pinned: pinnedMap.has(key) || false, loadingColumns: false, }); }); @@ -169,7 +173,7 @@ export default Vue.extend({ contextMenu: this.routineMenuOptions, parent, level: noFolder ? 0 : 1, - pinned: pinnedMap.get(routine) || false, + pinned: pinnedMap.has(key) || false, }); }); }); @@ -272,13 +276,13 @@ export default Vue.extend({ }, handleTogglePinned(entity: Entity, pinned?: boolean) { const item = this.items.find((item: Item) => item.entity === entity); + if (!item) return; + if (typeof pinned === "undefined") { pinned = !item.pinned; } - item.pinned = !item.pinned; - - if (pinned) this.$store.dispatch('pins/add', entity) - else this.$store.dispatch('pins/remove', entity) + item.pinned = pinned; + this.generateDisplayItems(); }, handleScrollEnd() { this.updateTableColumnsInRange(true); @@ -320,6 +324,10 @@ export default Vue.extend({ this.generateItems(); this.generateDisplayItems(); }, + pins() { + this.generateItems(); + this.generateDisplayItems(); + }, minimalMode() { this.generateDisplayItems(); }, From 6e58b9dabb9d36ea646b82d3899d4dad1be36107 Mon Sep 17 00:00:00 2001 From: ThiagoCComelli Date: Mon, 23 Feb 2026 21:41:47 -0300 Subject: [PATCH 13/23] Fix unpinned tables not being removed from db table --- apps/studio/src/store/modules/PinConnectionModule.ts | 4 ++-- apps/studio/src/store/modules/PinModule.ts | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/studio/src/store/modules/PinConnectionModule.ts b/apps/studio/src/store/modules/PinConnectionModule.ts index a18c747f4..9f6d4502e 100644 --- a/apps/studio/src/store/modules/PinConnectionModule.ts +++ b/apps/studio/src/store/modules/PinConnectionModule.ts @@ -62,9 +62,9 @@ export const PinConnectionModule: Module = { return; } - const newPin = await Vue.prototype.$util.send('appdb/pinconn/new', { init: item }); + let newPin = await Vue.prototype.$util.send('appdb/pinconn/new', { init: item }); newPin.position = (context.getters.orderedPins.reverse()[0]?.position || 0) + 1; - await Vue.prototype.$util.send('appdb/pinconn/save', { obj: newPin }) + newPin = await Vue.prototype.$util.send('appdb/pinconn/save', { obj: newPin }) context.commit('add', newPin); }, async reorder(context) { diff --git a/apps/studio/src/store/modules/PinModule.ts b/apps/studio/src/store/modules/PinModule.ts index c5812902d..cd5f8f372 100644 --- a/apps/studio/src/store/modules/PinModule.ts +++ b/apps/studio/src/store/modules/PinModule.ts @@ -7,7 +7,7 @@ import Vue from "vue"; function matches(pin: TransportPinnedEntity, entity: DatabaseEntity, database?: string) { return entity.name === pin.entityName && - ((_.isNil(entity.schema) && _.isNil(pin.schemaName)) || + ((_.isNil(entity.schema) && _.isNil(pin.schemaName)) || entity.schema === pin.schemaName) && entity.entityType === pin.entityType && (!database || database === pin.databaseName) @@ -75,7 +75,7 @@ export const PinModule: Module = { // this used to be !p.hasId(), hopefully this still works? the alternative is ugly const unsavedPins = context.state.pins.filter((p)=> !p.id) await Promise.all(unsavedPins.map((p) => { - p.connectionId === usedConfig.id && p.workspaceId === usedConfig.id && + p.connectionId === usedConfig.id && p.workspaceId === usedConfig.id && Vue.prototype.$util.send('appdb/pins/save', { obj: p }); })) }, @@ -86,7 +86,7 @@ export const PinModule: Module = { if (database && usedConfig) { console.log('GETTING NEW PIN: ', item, database, usedConfig) - const newPin = await Vue.prototype.$util.send('appdb/pins/new', { + let newPin = await Vue.prototype.$util.send('appdb/pins/new', { init: { table: item, db: database, @@ -95,7 +95,9 @@ export const PinModule: Module = { }); console.log('RECEIVED NEW PIN: ', newPin) newPin.position = (context.getters.orderedPins.reverse()[0]?.position || 0) + 1 - if(usedConfig.id) await Vue.prototype.$util.send('appdb/pins/save', { obj: newPin }); + if(usedConfig.id) { + newPin = await Vue.prototype.$util.send('appdb/pins/save', { obj: newPin }); + } context.commit('add', newPin) } }, From e781c72107fb4c34da2f5a362f506a498000e996 Mon Sep 17 00:00:00 2001 From: ThiagoCComelli Date: Mon, 23 Feb 2026 23:40:28 -0300 Subject: [PATCH 14/23] Remove unnecessary method calls --- .../components/sidebar/core/table_list/VirtualTableList.vue | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue b/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue index 6c81ceb1d..f8067d34f 100644 --- a/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue +++ b/apps/studio/src/components/sidebar/core/table_list/VirtualTableList.vue @@ -282,7 +282,6 @@ export default Vue.extend({ pinned = !item.pinned; } item.pinned = pinned; - this.generateDisplayItems(); }, handleScrollEnd() { this.updateTableColumnsInRange(true); @@ -324,10 +323,6 @@ export default Vue.extend({ this.generateItems(); this.generateDisplayItems(); }, - pins() { - this.generateItems(); - this.generateDisplayItems(); - }, minimalMode() { this.generateDisplayItems(); }, From 3a91d9500b41b77e00ffca8bf4faf7f7eb3ffc3d Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Tue, 24 Feb 2026 19:20:42 -0700 Subject: [PATCH 15/23] maybe fix for windows execution --- apps/studio/src/components/connection/CommonEntraId.vue | 9 +++++++++ apps/studio/src/lib/db/authentication/azure.ts | 2 +- apps/studio/src/lib/db/clients/utils.ts | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/studio/src/components/connection/CommonEntraId.vue b/apps/studio/src/components/connection/CommonEntraId.vue index 0717cc9b1..8ced6e11b 100644 --- a/apps/studio/src/components/connection/CommonEntraId.vue +++ b/apps/studio/src/components/connection/CommonEntraId.vue @@ -85,6 +85,15 @@ +
+ + +
+ @@ -140,12 +145,22 @@ import { AzureAuthType } from "@/lib/db/types"; import { AppEvent } from "@/common/AppEvent"; import _ from "lodash"; import MaskedInput from '@/components/MaskedInput.vue' +import CommonSsl from './CommonSsl.vue' import { mapState } from 'vuex' export default { - props: ["config", "authType"], + props: { + config: Object, + authType: [String, Number], + sslHelp: String, + supportComplexSSL: { + type: Boolean, + default: true + } + }, components: { MaskedInput, + CommonSsl, }, data() { return { diff --git a/apps/studio/src/components/connection/CommonServerInputs.vue b/apps/studio/src/components/connection/CommonServerInputs.vue index 54029a334..b8e9e888a 100644 --- a/apps/studio/src/components/connection/CommonServerInputs.vue +++ b/apps/studio/src/components/connection/CommonServerInputs.vue @@ -68,102 +68,11 @@ - - - - - - - - -
-
-

- Enable SSL - -

-
- {{ sslHelp }} -
+
@@ -207,11 +116,9 @@ diff --git a/apps/studio/src/components/connection/CommonSsl.vue b/apps/studio/src/components/connection/CommonSsl.vue new file mode 100644 index 000000000..1b5fe9b61 --- /dev/null +++ b/apps/studio/src/components/connection/CommonSsl.vue @@ -0,0 +1,156 @@ + + + From 4061fe3047aa8940dcbb2a965df81cf4f3d9572b Mon Sep 17 00:00:00 2001 From: Day Matchullis Date: Tue, 24 Feb 2026 21:21:48 -0700 Subject: [PATCH 18/23] make cli forms filepickers, remove accountname from top level forms --- .../src/components/connection/CommonEntraId.vue | 11 ++++------- apps/studio/src/components/connection/CommonIam.vue | 9 +++------ apps/studio/src/components/connection/MysqlForm.vue | 12 +++++------- .../src/components/connection/PostgresForm.vue | 8 -------- .../src/components/connection/SqlServerForm.vue | 1 - 5 files changed, 12 insertions(+), 29 deletions(-) diff --git a/apps/studio/src/components/connection/CommonEntraId.vue b/apps/studio/src/components/connection/CommonEntraId.vue index 24f1b99b2..81f69f69e 100644 --- a/apps/studio/src/components/connection/CommonEntraId.vue +++ b/apps/studio/src/components/connection/CommonEntraId.vue @@ -23,12 +23,7 @@ Azure CLI Path (az) - +
warning
@@ -49,7 +44,7 @@ style="padding-left: 0.25rem" v-tooltip="{ content: - 'This is the \'Server name\' field on your Sql Server in Azure,
you might also think of this as the hostname.
Eg. example.database.windows.net', + 'This is the \'Server name\' field on your database in Azure,
you might also think of this as the hostname.
Eg. example.database.windows.net', html: true, }" >help_outlined
- +
@@ -125,12 +120,14 @@