Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
210f2bc
initial stub rds package
rasswanth-s Jul 2, 2026
fc3363f
update import names
rasswanth-s Jul 2, 2026
8293a8f
add callbacks to syftbox manager
rasswanth-s Jul 2, 2026
3d96401
modify collections to be generic
rasswanth-s Jul 2, 2026
94d88d0
modify base colletion objects
rasswanth-s Jul 4, 2026
6e89e60
remove job/dataset refeerences in syftbox_manager
rasswanth-s Jul 4, 2026
9d8f877
shift bg to use syft-rds client
rasswanth-s Jul 4, 2026
f4c92ae
[encalves]shift enclaves package to use syft-rds client
rasswanth-s Jul 4, 2026
fe9341d
[encalves]fix enclaves testing
rasswanth-s Jul 4, 2026
63491fe
remove syft-client as dep from syft-bg
rasswanth-s Jul 7, 2026
0127295
[syft-bg] fix unit tests class naming
rasswanth-s Jul 7, 2026
e2b52bd
[syft-client] make collection generic
rasswanth-s Jul 7, 2026
55587f7
[syft-client] shift auto approval to syft-rds
rasswanth-s Jul 7, 2026
78f10be
Add initial RDSClient and Config implementations
rasswanth-s Jul 7, 2026
0a1f50c
shift to generic collection folder name
rasswanth-s Jul 7, 2026
91556c9
[syft-client] lean syft-client dependencies
rasswanth-s Jul 9, 2026
48f51b9
add RDS unit tests
rasswanth-s Jul 9, 2026
8167b7b
re-order batch collections
rasswanth-s Jul 14, 2026
d4977f4
parametrize collection folder names
rasswanth-s Jul 15, 2026
f963417
re-order collection sync spec
rasswanth-s Jul 15, 2026
717b7b8
re-order imports
rasswanth-s Jul 15, 2026
f82ed84
add exception handling to callbacks
rasswanth-s Jul 15, 2026
09dc366
shift location of peers loaded callback
rasswanth-s Jul 15, 2026
3bc4fa0
refactor lower level abstract methods in syft enclave client
rasswanth-s Jul 15, 2026
40bf126
fix: address PR review thread issues
Copilot Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/syft-bg/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ dependencies = [
"pydantic>=2.0.0",
"google-cloud-pubsub>=2.18.0",
"syft-job==0.1.39",
"syft-rds",
]

[project.scripts]
syft-bg = "syft_bg.cli:main"

[tool.uv.sources]
"syft-job" = { workspace = true }
"syft-rds" = { workspace = true }

[build-system]
requires = ["hatchling"]
Expand Down
4 changes: 2 additions & 2 deletions packages/syft-bg/src/syft_bg/approve/handlers/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
)

if TYPE_CHECKING:
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


class StateManager(Protocol):
Expand All @@ -33,7 +33,7 @@ class JobApprovalHandler:

def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
config_path: Optional[Path] = None,
state: Optional[StateManager] = None,
on_approve: Optional[Callable[[JobInfo], None]] = None,
Expand Down
4 changes: 2 additions & 2 deletions packages/syft-bg/src/syft_bg/approve/handlers/peer.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from syft_bg.approve.config import PeerApprovalConfig

if TYPE_CHECKING:
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


class StateManager(Protocol):
Expand All @@ -22,7 +22,7 @@ class PeerApprovalHandler:

def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
config: PeerApprovalConfig,
state: Optional[StateManager] = None,
on_approve: Optional[Callable[[str], None]] = None,
Expand Down
4 changes: 2 additions & 2 deletions packages/syft-bg/src/syft_bg/approve/monitors/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@

if TYPE_CHECKING:
from syft_job.job import JobInfo
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


class JobMonitor(Monitor):
"""Monitors for jobs to auto-approve."""

def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
config_path: Optional[Path] = None,
state: Optional[StateManager] = None,
on_approve: Optional[Callable[[JobInfo], None]] = None,
Expand Down
4 changes: 2 additions & 2 deletions packages/syft-bg/src/syft_bg/approve/monitors/peer.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@

if TYPE_CHECKING:
from syft_bg.approve.config import PeerApprovalConfig
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


class PeerMonitor(Monitor):
"""Monitors for peers to auto-approve."""

def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
config: PeerApprovalConfig,
state: Optional[StateManager] = None,
on_approve: Optional[Callable[[str], None]] = None,
Expand Down
32 changes: 18 additions & 14 deletions packages/syft-bg/src/syft_bg/approve/orchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@
from syft_bg.common.state import JsonStateManager

if TYPE_CHECKING:
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


class ApprovalOrchestrator(BaseOrchestrator):
"""Orchestrator for job and peer auto-approval service."""

def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
config: AutoApproveConfig,
config_path: Optional[Path] = None,
):
Expand All @@ -40,10 +40,10 @@ def setup(self) -> None:
@classmethod
def from_client(
cls,
client: SyftboxManager,
client: SyftRDSClient,
interval: int = 5,
) -> ApprovalOrchestrator:
"""Create orchestrator from a SyftboxManager client."""
"""Create orchestrator from a SyftRDSClient."""
if not client.has_do_role:
raise ValueError(
"ApprovalOrchestrator should only run on Data Owner (DO) side."
Expand All @@ -67,31 +67,35 @@ def from_config(
if not config.syftbox_root:
raise ValueError("Config missing 'syftbox_root' field")

# Wait for sync to seed the cache before building SyftboxManager —
# SyftboxManager.from_config triggers _load_file_hashes_from_disk,
# which races sync's identical replay if both run cold-start.
# Wait for sync to seed the cache before building the RDS client —
# its nested SyftboxManager.from_config triggers
# _load_file_hashes_from_disk, which races sync's identical replay if
# both run cold-start.
cls._wait_for_sync_ready(label="Approve")

from syft_client.sync.environments.environment import Environment
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_client.sync.utils.syftbox_utils import check_env
from syft_rds import (
Environment,
SyftRDSClient,
SyftRDSClientConfig,
check_env,
)

env = check_env()
if env == Environment.COLAB:
client = SyftboxManager.for_colab(
if check_env() == Environment.COLAB:
rds_config = SyftRDSClientConfig.for_colab(
email=config.do_email,
has_do_role=True,
skip_peer_on_patch_version_diff=config.skip_peer_on_patch_version_diff,
force_ignore_peer_version=config.force_ignore_peer_version,
)
else:
client = SyftboxManager.for_jupyter(
rds_config = SyftRDSClientConfig.for_jupyter(
email=config.do_email,
has_do_role=True,
token_path=config.drive_token_path,
skip_peer_on_patch_version_diff=config.skip_peer_on_patch_version_diff,
force_ignore_peer_version=config.force_ignore_peer_version,
)
client = SyftRDSClient.from_config(rds_config)

return cls(client=client, config=config)

Expand Down
2 changes: 1 addition & 1 deletion packages/syft-bg/src/syft_bg/cli/init/flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def _resolve_common_settings(config: UserPassedConfig, result: SyftBgConfig) ->
"Data Owner email address", default=default_email or None
)

from syft_client.sync.syftbox_manager import get_jupyter_default_syftbox_folder
from syft_rds import get_jupyter_default_syftbox_folder

default_syftbox = result.syftbox_root or str(
get_jupyter_default_syftbox_folder(result.do_email)
Expand Down
4 changes: 1 addition & 3 deletions packages/syft-bg/src/syft_bg/common/syft_bg_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ def _set_default_syftbox_root(cls, data: dict) -> dict:
if not isinstance(data, dict):
return data
if not data.get("syftbox_root") and data.get("do_email"):
from syft_client.sync.syftbox_manager import (
get_jupyter_default_syftbox_folder,
)
from syft_rds import get_jupyter_default_syftbox_folder

data = dict(data)
data["syftbox_root"] = str(
Expand Down
2 changes: 1 addition & 1 deletion packages/syft-bg/src/syft_bg/notify/handlers/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from syft_bg.common.state import JsonStateManager
from syft_bg.notify.gmail.sender import GmailSender
from syft_client.sync.utils.path_filters import is_normal_syncable_path
from syft_rds import is_normal_syncable_path

if TYPE_CHECKING:
from syft_job.client import JobClient
Expand Down
21 changes: 12 additions & 9 deletions packages/syft-bg/src/syft_bg/sync/orchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from syft_bg.sync.snapshot import PeerVersionInfo, SyncSnapshot

if TYPE_CHECKING:
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_rds import SyftRDSClient


def sync_ready_path() -> Path:
Expand All @@ -24,7 +24,7 @@ def sync_ready_path() -> Path:
class SyncOrchestrator(BaseOrchestrator):
def __init__(
self,
client: SyftboxManager,
client: SyftRDSClient,
state: JsonStateManager,
config: SyncConfig,
):
Expand All @@ -42,26 +42,29 @@ def from_config(cls, config: SyncConfig) -> SyncOrchestrator:
if not config.syftbox_root:
raise ValueError("SyncConfig missing 'syftbox_root'")

from syft_client.sync.environments.environment import Environment
from syft_client.sync.syftbox_manager import SyftboxManager
from syft_client.sync.utils.syftbox_utils import check_env
from syft_rds import (
Environment,
SyftRDSClient,
SyftRDSClientConfig,
check_env,
)

env = check_env()
if env == Environment.COLAB:
client = SyftboxManager.for_colab(
if check_env() == Environment.COLAB:
rds_config = SyftRDSClientConfig.for_colab(
email=config.do_email,
has_do_role=True,
skip_peer_on_patch_version_diff=config.skip_peer_on_patch_version_diff,
force_ignore_peer_version=config.force_ignore_peer_version,
)
else:
client = SyftboxManager.for_jupyter(
rds_config = SyftRDSClientConfig.for_jupyter(
email=config.do_email,
has_do_role=True,
token_path=config.drive_token_path,
skip_peer_on_patch_version_diff=config.skip_peer_on_patch_version_diff,
force_ignore_peer_version=config.force_ignore_peer_version,
)
client = SyftRDSClient.from_config(rds_config)

state = JsonStateManager(state_file=config.sync_state_path)

Expand Down
2 changes: 2 additions & 0 deletions packages/syft-enclave/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ requires-python = ">=3.10"

dependencies = [
"syft-client",
"syft-rds",
"pydantic-settings>=2.11.0",
"requests>=2.32.0",
"google-auth[pyjwt]>=2.22.0",
Expand All @@ -19,6 +20,7 @@ build-backend = "hatchling.build"

[tool.uv.sources]
"syft-client" = { workspace = true }
"syft-rds" = { workspace = true }

[tool.hatch.build.targets.wheel]
packages = ["src/syft_enclaves"]
Expand Down
Loading