From b3bfc83d0eb0343864152f80d04bcb41bb3f916d Mon Sep 17 00:00:00 2001 From: Kalvin Chau Date: Tue, 7 Jul 2026 18:34:43 -0700 Subject: [PATCH 1/4] fix: use berd session deeplinks update catch session activation to open berd:// session links while preserving goose acp client naming and protocol identifiers. --- Sources/Catch/Models/Session.swift | 4 ++-- Sources/Catch/Views/MainView.swift | 2 +- Tests/CatchTests/SessionDeepLinkTests.swift | 8 ++++---- docs/focus-hiding.md | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/Catch/Models/Session.swift b/Sources/Catch/Models/Session.swift index 3277deb..d4383dd 100644 --- a/Sources/Catch/Models/Session.swift +++ b/Sources/Catch/Models/Session.swift @@ -48,7 +48,7 @@ struct Session: Identifiable, Equatable { } } - var gooseInternalSessionURL: URL? { + var berdSessionURL: URL? { let trimmedSessionID = sessionID.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedSessionID.isEmpty, let encodedSessionID = trimmedSessionID.addingPercentEncoding(withAllowedCharacters: .urlPathSegmentAllowed) @@ -56,7 +56,7 @@ struct Session: Identifiable, Equatable { return nil } - return URL(string: "goose-internal://session/\(encodedSessionID)") + return URL(string: "berd://session/\(encodedSessionID)") } } diff --git a/Sources/Catch/Views/MainView.swift b/Sources/Catch/Views/MainView.swift index 913b61b..b0d36d7 100644 --- a/Sources/Catch/Views/MainView.swift +++ b/Sources/Catch/Views/MainView.swift @@ -538,7 +538,7 @@ private extension MainView { @discardableResult func activateSession(_ session: Session) -> Bool { - guard let url = session.gooseInternalSessionURL else { return false } + guard let url = session.berdSessionURL else { return false } openURL(url) NotificationCenter.default.post(name: .hideFloatingWindow, object: nil) return true diff --git a/Tests/CatchTests/SessionDeepLinkTests.swift b/Tests/CatchTests/SessionDeepLinkTests.swift index 66e8bf5..e647557 100644 --- a/Tests/CatchTests/SessionDeepLinkTests.swift +++ b/Tests/CatchTests/SessionDeepLinkTests.swift @@ -5,7 +5,7 @@ import Testing @Suite struct SessionDeepLinkTests { @Test - func buildsGooseInternalSessionURL() { + func buildsBerdSessionURL() { let session = Session( provider: .goose, sessionID: "abc-123", @@ -16,7 +16,7 @@ struct SessionDeepLinkTests { lastEvent: "" ) - #expect(session.gooseInternalSessionURL?.absoluteString == "goose-internal://session/abc-123") + #expect(session.berdSessionURL?.absoluteString == "berd://session/abc-123") } @Test @@ -31,7 +31,7 @@ struct SessionDeepLinkTests { lastEvent: "" ) - #expect(session.gooseInternalSessionURL?.absoluteString == "goose-internal://session/id%2Fwith%20spaces") + #expect(session.berdSessionURL?.absoluteString == "berd://session/id%2Fwith%20spaces") } @Test @@ -46,6 +46,6 @@ struct SessionDeepLinkTests { lastEvent: "" ) - #expect(session.gooseInternalSessionURL == nil) + #expect(session.berdSessionURL == nil) } } diff --git a/docs/focus-hiding.md b/docs/focus-hiding.md index 21763c6..269316f 100644 --- a/docs/focus-hiding.md +++ b/docs/focus-hiding.md @@ -42,9 +42,9 @@ Catch behaves like a transient command panel. The window should feel ready for t ## Session Activation -- Pressing Return while a session row is highlighted opens that session in Goose through `goose-internal://session/`. +- Pressing Return while a session row is highlighted opens that session in Berd through `berd://session/`. - Clicking a session row opens the session immediately instead of only selecting the row. -- Session IDs in Goose deep links must be percent-encoded as a single URL path segment. +- Session IDs in Berd deep links must be percent-encoded as a single URL path segment. - Opening a session hides the Catch panel using the same direct order-out path as Escape. ## Session Creation From ed76620bdea4d2a6f532894f9ba25b5e10022e6c Mon Sep 17 00:00:00 2001 From: Kalvin Chau Date: Tue, 7 Jul 2026 20:37:37 -0700 Subject: [PATCH 2/4] fix: allow large goose websocket messages increase the embedded goose websocket message limit so large metadata responses do not close the connection before session creation. --- Sources/Catch/Services/GooseServeClient.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/Catch/Services/GooseServeClient.swift b/Sources/Catch/Services/GooseServeClient.swift index 47fdec7..414ed6a 100644 --- a/Sources/Catch/Services/GooseServeClient.swift +++ b/Sources/Catch/Services/GooseServeClient.swift @@ -521,6 +521,8 @@ final class GooseServeClient: NSObject, @unchecked Sendable { let session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil) self.session = session let task = session.webSocketTask(with: try webSocketURL()) + // Large ACP metadata responses otherwise close the websocket with "Message too long". + task.maximumMessageSize = 64 * 1024 * 1024 webSocketTask = task task.resume() From a014d9b0cbfea2cc1b39cc1743de04f38d1bc504 Mon Sep 17 00:00:00 2001 From: Kalvin Chau Date: Tue, 7 Jul 2026 20:38:41 -0700 Subject: [PATCH 3/4] chore: update prompt placeholder copy rename the prompt placeholder from goose to berd. --- Sources/Catch/Views/MainView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Catch/Views/MainView.swift b/Sources/Catch/Views/MainView.swift index b0d36d7..2c5cd88 100644 --- a/Sources/Catch/Views/MainView.swift +++ b/Sources/Catch/Views/MainView.swift @@ -150,7 +150,7 @@ private extension MainView { TextField( text: $store.prompt, selection: $promptSelection, - prompt: Text("Chat with Goose, @ for agents, or / for skills"), + prompt: Text("Chat with Berd, @ for agents, or / for skills"), axis: .vertical ) { Text("Prompt") From 1e68e912e078fc9be7605c9e5fef9004f0b57d74 Mon Sep 17 00:00:00 2001 From: Kalvin Chau Date: Wed, 8 Jul 2026 08:23:40 -0700 Subject: [PATCH 4/4] ci: run swift tests on macos 26 match the github actions runner OS to the package macOS 26 deployment target and selected Xcode 26 toolchain. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c01e48..f375539 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ permissions: jobs: swift: name: Swift build and test - runs-on: macos-15 + runs-on: macos-26 timeout-minutes: 20 steps: