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: 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/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() diff --git a/Sources/Catch/Views/MainView.swift b/Sources/Catch/Views/MainView.swift index 913b61b..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") @@ -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