diff --git a/WorkbenchReplacement/MainView.swift b/WorkbenchReplacement/MainView.swift
index 66433dc..fa54828 100644
--- a/WorkbenchReplacement/MainView.swift
+++ b/WorkbenchReplacement/MainView.swift
@@ -33,6 +33,10 @@ struct MainView: View {
@State private var selectedTableName: String? = nil
@State private var outputExpanded = true
+ @State private var navigatorMode = 0
+ @State private var administrationPage: WorkbenchAdminPage? = nil
+
+
var body: some View {
VStack(spacing: 0) {
mainToolbar
@@ -163,8 +167,27 @@ struct MainView: View {
private var navigator: some View {
VStack(spacing: 0) {
- sectionHeader("NAVIGATOR")
+ Picker("Navigator", selection: $navigatorMode) {
+ Text("Administration").tag(0)
+ Text("Schemas").tag(1)
+ }
+ .pickerStyle(.segmented)
+ .labelsHidden()
+ .padding(8)
+ if navigatorMode == 0 {
+ administrationNavigator
+ } else {
+ schemasNavigator
+ }
+
+
+ }
+ .background(WB.sidebar)
+ }
+
+ private var schemasNavigator: some View {
+ VStack(spacing: 0) {
HStack {
Text("SCHEMAS")
.font(.system(size: 11, weight: .bold))
@@ -230,7 +253,67 @@ struct MainView: View {
}
.frame(height: 125)
}
- .background(WB.sidebar)
+ }
+
+ private var administrationNavigator: some View {
+ ScrollView {
+ VStack(alignment: .leading, spacing: 4) {
+ administrationSection(
+ "MANAGEMENT",
+ pages: [
+ .serverStatus,
+ .clientConnections,
+ .users,
+ .variables
+ ]
+ )
+
+ administrationSection(
+ "PERFORMANCE",
+ pages: [
+ .dashboard,
+ .performanceReports,
+ .performanceSchema
+ ]
+ )
+ }
+ .padding(8)
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
+ }
+
+ private func administrationSection(
+ _ title: String,
+ pages: [WorkbenchAdminPage]
+ ) -> some View {
+ VStack(alignment: .leading, spacing: 4) {
+ Text(title)
+ .font(.system(size: 11, weight: .bold))
+ .foregroundStyle(.secondary)
+ .padding(.top, 12)
+ .padding(.bottom, 4)
+
+ ForEach(pages) { page in
+ Button {
+ administrationPage = page
+ } label: {
+ Label(page.rawValue, systemImage: page.icon)
+ .frame(
+ maxWidth: .infinity,
+ alignment: .leading
+ )
+ .padding(.horizontal, 8)
+ .padding(.vertical, 7)
+ .background(
+ administrationPage == page
+ ? Color.accentColor.opacity(0.18)
+ : Color.clear
+ )
+ .clipShape(RoundedRectangle(cornerRadius: 5))
+ }
+ .buttonStyle(.plain)
+ }
+ }
}
@@ -444,6 +527,22 @@ struct MainView: View {
// MARK: - Workspace
private var workspace: some View {
+ Group {
+ if let page = administrationPage {
+ WorkbenchAdministrationView(
+ page: page,
+ profile: model.selected
+ ) {
+ administrationPage = nil
+ navigatorMode = 1
+ }
+ } else {
+ sqlWorkspace
+ }
+ }
+ }
+
+ private var sqlWorkspace: some View {
VStack(spacing: 0) {
queryTabBar
@@ -1143,3 +1242,300 @@ struct NativeResultGrid: NSViewRepresentable {
}
}
}
+
+
+// MARK: - MySQL Administration
+
+enum WorkbenchAdminPage: String, CaseIterable, Identifiable {
+ case serverStatus = "Server Status"
+ case clientConnections = "Client Connections"
+ case users = "Users and Privileges"
+ case variables = "Status and System Variables"
+ case dashboard = "Dashboard"
+ case performanceReports = "Performance Reports"
+ case performanceSchema = "Performance Schema Setup"
+
+ var id: String { rawValue }
+
+ var icon: String {
+ switch self {
+ case .serverStatus: return "server.rack"
+ case .clientConnections: return "person.2"
+ case .users: return "person.crop.circle.badge.checkmark"
+ case .variables: return "slider.horizontal.3"
+ case .dashboard: return "chart.xyaxis.line"
+ case .performanceReports: return "chart.bar.xaxis"
+ case .performanceSchema: return "gauge.with.dots.needle.67percent"
+ }
+ }
+
+ var statement: String {
+ switch self {
+ case .serverStatus:
+ return """
+ SHOW GLOBAL STATUS WHERE Variable_name IN (
+ 'Uptime',
+ 'Threads_connected',
+ 'Threads_running',
+ 'Questions',
+ 'Queries',
+ 'Connections',
+ 'Bytes_received',
+ 'Bytes_sent'
+ )
+ """
+
+ case .clientConnections:
+ return "SHOW FULL PROCESSLIST"
+
+ case .users:
+ return """
+ SELECT User, Host, plugin, account_locked
+ FROM mysql.user
+ ORDER BY User, Host
+ """
+
+ case .variables:
+ return "SHOW GLOBAL VARIABLES"
+
+ case .dashboard:
+ return """
+ SHOW GLOBAL STATUS WHERE Variable_name IN (
+ 'Uptime',
+ 'Connections',
+ 'Threads_connected',
+ 'Threads_running',
+ 'Questions',
+ 'Queries',
+ 'Bytes_received',
+ 'Bytes_sent',
+ 'Innodb_buffer_pool_reads',
+ 'Innodb_buffer_pool_read_requests',
+ 'Slow_queries'
+ )
+ """
+
+ case .performanceReports:
+ return """
+ SELECT *
+ FROM sys.statement_analysis
+ LIMIT 100
+ """
+
+ case .performanceSchema:
+ return """
+ SELECT NAME, ENABLED, TIMED
+ FROM performance_schema.setup_instruments
+ LIMIT 250
+ """
+ }
+ }
+}
+
+struct WorkbenchAdministrationView: View {
+ let page: WorkbenchAdminPage
+ let profile: ConnectionProfile?
+ let close: () -> Void
+
+ @State private var result = QueryResult()
+ @State private var loading = false
+ @State private var errorMessage: String?
+ @State private var lastUpdated: Date?
+
+ var body: some View {
+ VStack(spacing: 0) {
+ header
+
+ Divider()
+
+ if loading && result.columns.isEmpty {
+ Spacer()
+
+ ProgressView("Loading \(page.rawValue)…")
+
+ Spacer()
+ } else if let errorMessage {
+ ContentUnavailableView {
+ Label(
+ "Unable to Load \(page.rawValue)",
+ systemImage: "exclamationmark.triangle"
+ )
+ } description: {
+ Text(errorMessage)
+ } actions: {
+ Button("Retry") {
+ Task { await refresh() }
+ }
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
+ } else if result.columns.isEmpty {
+ ContentUnavailableView(
+ "No Data",
+ systemImage: "tablecells",
+ description: Text(
+ "The server did not return any columns."
+ )
+ )
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
+ } else {
+ resultContent
+ }
+
+ Divider()
+
+ footer
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity)
+ .task(id: "\(page.id)-\(profile?.id.uuidString ?? "")") {
+ await refresh()
+ }
+ }
+
+ private var header: some View {
+ HStack(spacing: 14) {
+ Image(systemName: page.icon)
+ .font(.system(size: 27))
+ .foregroundStyle(.blue)
+ .frame(width: 40)
+
+ VStack(alignment: .leading, spacing: 3) {
+ Text(profile?.name ?? "No Connection")
+ .font(.caption)
+ .foregroundStyle(.secondary)
+
+ Text(page.rawValue)
+ .font(.system(size: 22, weight: .semibold))
+ }
+
+ Spacer()
+
+ Button {
+ Task { await refresh() }
+ } label: {
+ Label("Refresh", systemImage: "arrow.clockwise")
+ }
+ .disabled(loading)
+
+ Button {
+ close()
+ } label: {
+ Label("SQL Editor", systemImage: "chevron.left.forwardslash.chevron.right")
+ }
+ }
+ .padding(18)
+ }
+
+ @ViewBuilder
+ private var resultContent: some View {
+ if page == .dashboard || page == .serverStatus {
+ ScrollView {
+ LazyVGrid(
+ columns: [
+ GridItem(.adaptive(minimum: 180), spacing: 12)
+ ],
+ spacing: 12
+ ) {
+ ForEach(result.rows.indices, id: \.self) { index in
+ let row = result.rows[index]
+
+ if row.count >= 2 {
+ VStack(alignment: .leading, spacing: 10) {
+ Text(
+ row[0]
+ .replacingOccurrences(
+ of: "_",
+ with: " "
+ )
+ )
+ .font(.caption)
+ .foregroundStyle(.secondary)
+
+ Text(row[1])
+ .font(
+ .system(
+ size: 23,
+ weight: .semibold,
+ design: .rounded
+ )
+ )
+ .lineLimit(1)
+ .minimumScaleFactor(0.65)
+ }
+ .frame(
+ maxWidth: .infinity,
+ minHeight: 90,
+ alignment: .leading
+ )
+ .padding(14)
+ .background(
+ Color(nsColor: .controlBackgroundColor)
+ )
+ .clipShape(
+ RoundedRectangle(cornerRadius: 10)
+ )
+ }
+ }
+ }
+ .padding(18)
+ }
+ } else {
+ NativeResultGrid(
+ columns: result.columns,
+ rows: result.rows
+ )
+ .frame(
+ maxWidth: .infinity,
+ maxHeight: .infinity
+ )
+ }
+ }
+
+ private var footer: some View {
+ HStack {
+ if let lastUpdated {
+ Text(
+ "Updated \(lastUpdated.formatted(date: .omitted, time: .standard))"
+ )
+ } else {
+ Text("Not loaded")
+ }
+
+ Spacer()
+
+ Text("\(result.rows.count) rows")
+ }
+ .font(.caption)
+ .foregroundStyle(.secondary)
+ .padding(.horizontal, 16)
+ .frame(height: 30)
+ }
+
+ @MainActor
+ private func refresh() async {
+ guard let profile else {
+ errorMessage = "Select a MySQL connection first."
+ return
+ }
+
+ loading = true
+ errorMessage = nil
+
+ defer {
+ loading = false
+ }
+
+ do {
+ let response = try await NativeMySQLRunner.run(
+ profile: profile,
+ database: "",
+ password: PasswordStore.read(profile.id),
+ sql: page.statement
+ )
+
+ result = response
+ lastUpdated = Date()
+ } catch {
+ errorMessage = error.localizedDescription
+ }
+ }
+}
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o
index 69bb6d7..8d2c075 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.o differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps
index 98dbf47..6d6cb18 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/App.swiftdeps differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o
index c5fca8a..1072684 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.o differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata
index 1f714ff..2081851 100644
--- a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata
+++ b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.stringsdata
@@ -7,7 +7,31 @@
"key": "MySQL Workbench",
"location": {
"startingColumn": 18,
- "startingLine": 84
+ "startingLine": 88
+ }
+ },
+ {
+ "comment": "",
+ "key": "Navigator",
+ "location": {
+ "startingColumn": 20,
+ "startingLine": 170
+ }
+ },
+ {
+ "comment": "",
+ "key": "Administration",
+ "location": {
+ "startingColumn": 22,
+ "startingLine": 171
+ }
+ },
+ {
+ "comment": "",
+ "key": "Schemas",
+ "location": {
+ "startingColumn": 22,
+ "startingLine": 172
}
},
{
@@ -15,7 +39,7 @@
"key": "SCHEMAS",
"location": {
"startingColumn": 22,
- "startingLine": 169
+ "startingLine": 192
}
},
{
@@ -23,7 +47,7 @@
"key": "Edit Connection",
"location": {
"startingColumn": 36,
- "startingLine": 223
+ "startingLine": 246
}
},
{
@@ -31,7 +55,7 @@
"key": "Set as Default Schema",
"location": {
"startingColumn": 24,
- "startingLine": 280
+ "startingLine": 363
}
},
{
@@ -39,7 +63,7 @@
"key": "Refresh Tables",
"location": {
"startingColumn": 24,
- "startingLine": 284
+ "startingLine": 367
}
},
{
@@ -47,7 +71,7 @@
"key": "Load Tables",
"location": {
"startingColumn": 28,
- "startingLine": 354
+ "startingLine": 437
}
},
{
@@ -55,7 +79,7 @@
"key": "Tables",
"location": {
"startingColumn": 22,
- "startingLine": 327
+ "startingLine": 410
}
},
{
@@ -63,7 +87,7 @@
"key": "Select First 100 Rows",
"location": {
"startingColumn": 20,
- "startingLine": 410
+ "startingLine": 493
}
},
{
@@ -71,7 +95,7 @@
"key": "New Query Tab",
"location": {
"startingColumn": 19,
- "startingLine": 515
+ "startingLine": 614
}
},
{
@@ -79,7 +103,7 @@
"key": "Default Schema:",
"location": {
"startingColumn": 18,
- "startingLine": 540
+ "startingLine": 639
}
},
{
@@ -87,7 +111,7 @@
"key": "SQL Editor",
"location": {
"startingColumn": 18,
- "startingLine": 550
+ "startingLine": 649
}
},
{
@@ -95,7 +119,7 @@
"key": "Execute SQL",
"location": {
"startingColumn": 19,
- "startingLine": 528
+ "startingLine": 627
}
},
{
@@ -103,7 +127,7 @@
"key": "Format SQL",
"location": {
"startingColumn": 19,
- "startingLine": 535
+ "startingLine": 634
}
},
{
@@ -111,7 +135,7 @@
"key": "%lld",
"location": {
"startingColumn": 26,
- "startingLine": 590
+ "startingLine": 689
}
},
{
@@ -119,7 +143,7 @@
"key": "Result Grid",
"location": {
"startingColumn": 22,
- "startingLine": 622
+ "startingLine": 721
}
},
{
@@ -127,7 +151,7 @@
"key": "No query results",
"location": {
"startingColumn": 26,
- "startingLine": 640
+ "startingLine": 739
}
},
{
@@ -135,7 +159,7 @@
"key": "Action Output",
"location": {
"startingColumn": 22,
- "startingLine": 662
+ "startingLine": 761
}
},
{
@@ -143,7 +167,7 @@
"key": "UTF-8",
"location": {
"startingColumn": 18,
- "startingLine": 737
+ "startingLine": 836
}
},
{
@@ -151,7 +175,7 @@
"key": "Connection Settings",
"location": {
"startingColumn": 18,
- "startingLine": 912
+ "startingLine": 1011
}
},
{
@@ -159,7 +183,7 @@
"key": "Connection Name",
"location": {
"startingColumn": 21,
- "startingLine": 917
+ "startingLine": 1016
}
},
{
@@ -167,7 +191,7 @@
"key": "Hostname",
"location": {
"startingColumn": 21,
- "startingLine": 922
+ "startingLine": 1021
}
},
{
@@ -175,7 +199,7 @@
"key": "Port",
"location": {
"startingColumn": 21,
- "startingLine": 927
+ "startingLine": 1026
}
},
{
@@ -183,7 +207,7 @@
"key": "Username",
"location": {
"startingColumn": 21,
- "startingLine": 933
+ "startingLine": 1032
}
},
{
@@ -191,7 +215,7 @@
"key": "Password (macOS Keychain)",
"location": {
"startingColumn": 21,
- "startingLine": 938
+ "startingLine": 1037
}
},
{
@@ -199,7 +223,7 @@
"key": "Default Schema",
"location": {
"startingColumn": 21,
- "startingLine": 943
+ "startingLine": 1042
}
},
{
@@ -207,7 +231,7 @@
"key": "Cancel",
"location": {
"startingColumn": 24,
- "startingLine": 951
+ "startingLine": 1050
}
},
{
@@ -215,7 +239,87 @@
"key": "Save",
"location": {
"startingColumn": 24,
- "startingLine": 955
+ "startingLine": 1054
+ }
+ },
+ {
+ "comment": "",
+ "key": "The server did not return any columns.",
+ "location": {
+ "startingColumn": 25,
+ "startingLine": 1376
+ }
+ },
+ {
+ "comment": "",
+ "key": "Loading %@…",
+ "location": {
+ "startingColumn": 30,
+ "startingLine": 1354
+ }
+ },
+ {
+ "comment": "",
+ "key": "No Data",
+ "location": {
+ "startingColumn": 21,
+ "startingLine": 1373
+ }
+ },
+ {
+ "comment": "",
+ "key": "Unable to Load %@",
+ "location": {
+ "startingColumn": 25,
+ "startingLine": 1360
+ }
+ },
+ {
+ "comment": "",
+ "key": "Retry",
+ "location": {
+ "startingColumn": 28,
+ "startingLine": 1366
+ }
+ },
+ {
+ "comment": "",
+ "key": "Refresh",
+ "location": {
+ "startingColumn": 23,
+ "startingLine": 1415
+ }
+ },
+ {
+ "comment": "",
+ "key": "SQL Editor",
+ "location": {
+ "startingColumn": 23,
+ "startingLine": 1422
+ }
+ },
+ {
+ "comment": "",
+ "key": "Not loaded",
+ "location": {
+ "startingColumn": 22,
+ "startingLine": 1500
+ }
+ },
+ {
+ "comment": "",
+ "key": "Updated %@",
+ "location": {
+ "startingColumn": 21,
+ "startingLine": 1497
+ }
+ },
+ {
+ "comment": "",
+ "key": "%lld rows",
+ "location": {
+ "startingColumn": 18,
+ "startingLine": 1505
}
}
]
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps
index 7e43ef0..75224dc 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/MainView.swiftdeps differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors
index 8d27582..e0c7568 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement-primary.priors differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule
index 3afe490..b2804d4 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftmodule differ
diff --git a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo
index 86edb71..6731660 100644
Binary files a/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo and b/build/Build/Intermediates.noindex/WorkbenchReplacement.build/Debug/WorkbenchReplacement.build/Objects-normal/arm64/WorkbenchReplacement.swiftsourceinfo differ
diff --git a/build/Build/Intermediates.noindex/XCBuildData/build.db b/build/Build/Intermediates.noindex/XCBuildData/build.db
index 799e17b..2195bf4 100644
Binary files a/build/Build/Intermediates.noindex/XCBuildData/build.db and b/build/Build/Intermediates.noindex/XCBuildData/build.db differ
diff --git a/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt b/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt
index 0fb51df..4e9b961 100644
--- a/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt
+++ b/build/Build/Intermediates.noindex/XCBuildData/registered-launchservices.txt
@@ -3,3 +3,4 @@
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
+/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement
index a8b9a09..f278b84 100755
Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement differ
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib
index 6cb83e1..bd0b336 100755
Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/WorkbenchReplacement.debug.dylib differ
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib
index d957c0e..e192b46 100755
Binary files a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib and b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/MacOS/__preview.dylib differ
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources
index 6379196..ce832c6 100644
--- a/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources
+++ b/build/Build/Products/Debug/WorkbenchReplacement.app/Contents/_CodeSignature/CodeResources
@@ -19,7 +19,7 @@
cdhash
- 1TJJDc7LhSK1AHyUbPhKlUy9S8A=
+ 5Wek/oPAL5JjNIHDxN/dkqjd0UI=
requirement
identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo
index 86edb71..6731660 100644
Binary files a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo and b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/Project/arm64-apple-macos.swiftsourceinfo differ
diff --git a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule
index 3afe490..b2804d4 100644
Binary files a/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule and b/build/Build/Products/Debug/WorkbenchReplacement.swiftmodule/arm64-apple-macos.swiftmodule differ
diff --git a/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 b/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3
index 01e2ccc..d3ff8c9 100644
Binary files a/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 and b/build/Index.noindex/DataStore/v5/units/MainView.o-CNVK7PE7JUX3 differ
diff --git a/build/Logs/Build/LogStoreManifest.plist b/build/Logs/Build/LogStoreManifest.plist
index 264ff7f..ee1836a 100644
--- a/build/Logs/Build/LogStoreManifest.plist
+++ b/build/Logs/Build/LogStoreManifest.plist
@@ -90,6 +90,48 @@
uniqueIdentifier
8EB6F71B-1109-492D-84B8-8C2FE5C14BB0
+ AD44F407-7FE5-46AE-A82F-8FAC1CA2720B
+
+ className
+ IDECommandLineBuildLog
+ documentTypeString
+ <nil>
+ domainType
+ Xcode.IDEActivityLogDomainType.BuildLog
+ fileName
+ AD44F407-7FE5-46AE-A82F-8FAC1CA2720B.xcactivitylog
+ hasPrimaryLog
+
+ primaryObservable
+
+ highLevelStatus
+ S
+ totalNumberOfAnalyzerIssues
+ 0
+ totalNumberOfErrors
+ 0
+ totalNumberOfTestFailures
+ 0
+ totalNumberOfWarnings
+ 0
+
+ schemeIdentifier-containerName
+ WorkbenchReplacement project
+ schemeIdentifier-schemeName
+ WorkbenchReplacement
+ schemeIdentifier-sharedScheme
+ 1
+ signature
+ Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug
+ timeStartedRecording
+ 813875703.86912405
+ timeStoppedRecording
+ 813875715.47182798
+ title
+ Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug
+ uniqueIdentifier
+ AD44F407-7FE5-46AE-A82F-8FAC1CA2720B
+
diff --git a/build/ModuleCache.noindex/Session.modulevalidation b/build/ModuleCache.noindex/Session.modulevalidation
index f419104..3d7bb35 100644
--- a/build/ModuleCache.noindex/Session.modulevalidation
+++ b/build/ModuleCache.noindex/Session.modulevalidation
@@ -1 +1 @@
-1792182796.251258: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
+1792182904.277697: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
diff --git a/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache b/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache
index 89e946b..78fd62c 100644
Binary files a/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache and b/build/SDKStatCaches.noindex/macosx27.0-26A425-e829b21a6f8c9b70876ba0858053c0447231f6df4def33e022ae2eb8f782df1a.sdkstatcache differ
diff --git a/build/info.plist b/build/info.plist
index d38f3ec..ce4b1e8 100644
--- a/build/info.plist
+++ b/build/info.plist
@@ -3,7 +3,7 @@
LastAccessedDate
- 2026-10-16T20:33:16Z
+ 2026-10-16T20:35:04Z
WorkspacePath
/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj