From e910fd5dd480d8e9aed76c1f511f5be598763d6f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 5 Jul 2026 16:42:21 +0000 Subject: [PATCH 1/2] Declare relaycast dependency in root Package.swift AgentRelaySDK unconditionally imports Relaycast, but only the nested packages/sdk-swift/Package.swift declared the relaycast package dependency. Consumers that depend on this repository by git URL resolve the ROOT manifest, so resolution succeeded but the build failed with "no such module 'Relaycast'". Mirror the dependency (and the target's product dependency) in the root manifest, matching the nested one (relaycast >= 5.0.5). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01SvFT5BtnEoYzXvYLS3RiYe --- CHANGELOG.md | 1 + Package.swift | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1bbdc951..9b9d6cd5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Swift SDK: the repo-root `Package.swift` now declares the `relaycast` dependency that `AgentRelaySDK` imports, so depending on this repository by git URL (SwiftPM resolves the root manifest) builds instead of failing with "no such module 'Relaycast'". - `HarnessDriverClient.spawn()` now polls the broker's startup handshake for the full `startupTimeoutMs` budget (default 45s) instead of a fixed ~10s, so a slow-but-healthy Relaycast handshake that keeps answering `503` while warming up is no longer misreported as a spawn failure. - `agent-relay integration subscribe` now resolves provider-native `--resource` values through relayfile before binding, so Slack channel names, GitHub repos, Linear team keys, and Telegram chats bind to matching relayfile VFS globs while explicit `/`-prefixed globs still work. - `agent-relay integration subscribe` is now idempotent and supports multiple resources/channels per provider. Each inbound webhook is scoped to its `(provider, resource)` binding (not one-per-provider), so subscribing a second Slack channel — or two sources into the same relay channel — no longer collides on the unique `(workspace, webhook name)` index or clobbers the other binding's webhook. Re-subscribing creates the replacement webhook/subscription before retiring the old one, so a transient failure can't leave you with no working binding; a failed cleanup now warns instead of being silently swallowed. The relay channel id is normalized (`#general` → `general`) consistently across the webhook, subscription filter, relayfile bind, and writeback-secret lookup, and `listBindings` now maps relayfile's `pathGlob` field so unsubscribe/replace match correctly. diff --git a/Package.swift b/Package.swift index 60b4f7983..5d77acdc8 100644 --- a/Package.swift +++ b/Package.swift @@ -13,9 +13,21 @@ let package = Package( .library(name: "AgentRelaySDK", targets: ["AgentRelaySDK"]), .library(name: "AgentRelayBrokerSDK", targets: ["AgentRelayBrokerSDK"]) ], + dependencies: [ + // Must mirror packages/sdk-swift/Package.swift: AgentRelaySDK imports + // Relaycast, and consumers that depend on this repo by git URL resolve + // THIS manifest, so the dependency has to be declared here too. + .package( + url: "https://github.com/AgentWorkforce/relaycast.git", + from: "5.0.5" + ) + ], targets: [ .target( name: "AgentRelaySDK", + dependencies: [ + .product(name: "Relaycast", package: "relaycast") + ], path: "packages/sdk-swift/Sources/AgentRelaySDK" ), .target( From 8551bc518edfdacefd0969ebe970a3f7e70072da Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 5 Jul 2026 16:44:40 +0000 Subject: [PATCH 2/2] Tighten changelog entry per style guide Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01SvFT5BtnEoYzXvYLS3RiYe --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b9d6cd5b..87d9747f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Swift SDK: the repo-root `Package.swift` now declares the `relaycast` dependency that `AgentRelaySDK` imports, so depending on this repository by git URL (SwiftPM resolves the root manifest) builds instead of failing with "no such module 'Relaycast'". +- Swift SDK: depending on this repository by git URL no longer fails with `no such module 'Relaycast'` — the root `Package.swift` now declares the `relaycast` dependency `AgentRelaySDK` imports. - `HarnessDriverClient.spawn()` now polls the broker's startup handshake for the full `startupTimeoutMs` budget (default 45s) instead of a fixed ~10s, so a slow-but-healthy Relaycast handshake that keeps answering `503` while warming up is no longer misreported as a spawn failure. - `agent-relay integration subscribe` now resolves provider-native `--resource` values through relayfile before binding, so Slack channel names, GitHub repos, Linear team keys, and Telegram chats bind to matching relayfile VFS globs while explicit `/`-prefixed globs still work. - `agent-relay integration subscribe` is now idempotent and supports multiple resources/channels per provider. Each inbound webhook is scoped to its `(provider, resource)` binding (not one-per-provider), so subscribing a second Slack channel — or two sources into the same relay channel — no longer collides on the unique `(workspace, webhook name)` index or clobbers the other binding's webhook. Re-subscribing creates the replacement webhook/subscription before retiring the old one, so a transient failure can't leave you with no working binding; a failed cleanup now warns instead of being silently swallowed. The relay channel id is normalized (`#general` → `general`) consistently across the webhook, subscription filter, relayfile bind, and writeback-secret lookup, and `listBindings` now maps relayfile's `pathGlob` field so unsubscribe/replace match correctly.