Skip to content

feat(cloud): add connection state and catalog management to CloudConnection#975

Merged
Aaron ("AJ") Steers (aaronsteers) merged 28 commits into
mainfrom
devin/1770419251-connection-state-management
Feb 7, 2026
Merged

feat(cloud): add connection state and catalog management to CloudConnection#975
Aaron ("AJ") Steers (aaronsteers) merged 28 commits into
mainfrom
devin/1770419251-connection-state-management

Conversation

@aaronsteers

@aaronsteers Aaron ("AJ") Steers (aaronsteers) commented Feb 6, 2026

Copy link
Copy Markdown
Member

Summary

Adds connection state and catalog dump/import operations to CloudConnection, extracted from airbytehq/airbyte-ops-mcp#338 as reusable core library functionality. This enables both MCP tools and CLI commands to share the same implementation via PyAirbyte.

Private module airbyte/cloud/_connection_state.py:

  • Pydantic models (ConnectionStateResponse, StreamState, GlobalState, StreamDescriptor) with camelCase aliases — used internally only, not exported in the public API
  • Helper functions _match_stream() and _get_stream_list() for stream-level filtering

New CloudConnection methods (all inputs/outputs are raw dicts):

Method Purpose
dump_raw_state() Returns the full raw state envelope as a dict (backup use case)
import_raw_state(connection_state_dict) Replaces the entire connection state (restore use case). Always overrides connectionId for cross-connection portability. Safe endpoint rejects updates during active syncs (HTTP 423).
get_stream_state(stream_name) Returns just the inner state blob for one stream
set_stream_state(stream_name, state_blob_dict) Fetch-modify-push for a single stream's state; fails on legacy/not_set states
dump_raw_catalog() Returns the configured catalog (syncCatalog) as a dict
import_raw_catalog(catalog) Replaces the entire configured catalog via PATCH-style update

API layer (api_util.py):

  • replace_connection_state() — calls POST /v1/state/create_or_update_safe, catches HTTP 423 → AirbyteConnectionSyncActiveError
  • replace_connection_catalog() — calls POST /v1/web_backend/connections/update with skipReset: False

Other changes:

  • get_state_artifacts() and get_catalog_artifact() deprecated via @deprecated decorator
  • New AirbyteConnectionSyncActiveError exception for HTTP 423
  • MCP get_connection_artifact tool updated to use dump_raw_state() / dump_raw_catalog()
  • set_stream_state preserves raw dicts for non-matching streams (avoids Pydantic round-trip data loss)

Review & Testing Checklist for Human

  • set_stream_state fetch-modify-push correctness (HIGH RISK): This method uses zip(raw_streams, parsed_streams) to pair raw API dicts with Pydantic-parsed models for matching. Non-matching streams are preserved as raw dicts (no Pydantic round-trip), but the zip pairing assumes the raw and parsed lists are in the same order and same length. Must be tested against a real connection with both stream and global state types.
  • import_raw_catalog with skipReset: False: Catalog replacement triggers destination table resets. For backup/restore workflows where the catalog hasn't actually changed, this could unnecessarily reset destination tables. Evaluate whether skipReset should be a caller-configurable parameter.
  • connectionId override behavior: replace_connection_state does {**connection_state_dict, "connectionId": connection_id}. Verify the API accepts this and doesn't require connectionId in a nested location.
  • Namespace matching semantics: _match_stream() treats None and "" as equivalent (both mean "no namespace"). There is no wildcard behavior — caller must match the actual namespace. Verify this is acceptable.

Suggested test plan:

from airbyte.cloud import CloudWorkspace

workspace = CloudWorkspace(workspace_id="...", client_id="...", client_secret="...")
connection = workspace.get_connection(connection_id="<real-connection-id>")

# Full state dump/import round-trip
state = connection.dump_raw_state()
print(state)
# connection.import_raw_state(state)  # only when safe to test

# Cross-connection portability test
# other_connection = workspace.get_connection(connection_id="<different-connection-id>")
# other_connection.import_raw_state(state)  # should work — connectionId is overridden

# Stream-level get/set
stream_state = connection.get_stream_state("some_stream_name")
print(stream_state)
# connection.set_stream_state("some_stream", {"cursor": "2024-01-01"})

# Catalog dump/import
catalog = connection.dump_raw_catalog()
print(catalog)
# connection.import_raw_catalog(catalog)  # triggers reset!

Notes

  • Unit tests cover models and helper functions (15 tests, all passing)
  • No integration tests for the CloudConnection methods — they require real API credentials
  • This PR is a prerequisite for refactoring airbyte-ops-mcp#338 to use PyAirbyte as a dependency

Link to Devin run: https://app.devin.ai/sessions/5ce605c67c5f436d94d5d76a2c6b95fc
Requested by: Aaron ("AJ") Steers (@aaronsteers)

Summary by CodeRabbit

  • New Features

    • Full connection state and catalog management: dump/import/replace entire connection state and sync catalog; per-stream read/update helpers; structured connection state model.
  • Bug Fixes / Reliability

    • New specific error surfaced when attempting state updates during an active sync (HTTP 423).
  • Deprecated

    • Legacy state/catalog artifact retrieval methods marked deprecated; use the new dump/import APIs.
  • Tests

    • Unit tests covering connection state models, (de)serialization, and per-stream/global behaviors.
  • API

    • Connection artifact responses now consistently return a single object rather than mixed types.

Important

Auto-merge enabled.

This PR is set to merge automatically when all requirements are met.

Add typed connection state get/set operations with stream-level filtering:
- New connection_state module with Pydantic models (ConnectionStateResponse,
  StreamState, GlobalState, StreamDescriptor) with camelCase API aliases
- CloudConnection.get_state() - typed state retrieval with optional stream filter
- CloudConnection.set_state() - full state update via safe endpoint (HTTP 423 guard)
- CloudConnection.get_stream_state() - convenience single-stream state getter
- CloudConnection.set_stream_state() - fetch-modify-push single stream update
- API layer: create_or_update_connection_state_safe() in api_util
- Unit tests for models and helper functions (15 tests)

Co-Authored-By: AJ Steers <aj@airbyte.io>
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@github-actions

github-actions Bot commented Feb 6, 2026

Copy link
Copy Markdown

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

Testing This PyAirbyte Version

You can test this version of PyAirbyte using the following:

# Run PyAirbyte CLI from this branch:
uvx --from 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1770419251-connection-state-management' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1770419251-connection-state-management'

PR Slash Commands

Airbyte Maintainers can execute the following slash commands on your PR:

  • /fix-pr - Fixes most formatting and linting issues
  • /uv-lock - Updates uv.lock file
  • /test-pr - Runs tests with the updated PyAirbyte
  • /prerelease - Builds and publishes a prerelease version to PyPI
📚 Show Repo Guidance

Helpful Resources

Community Support

Questions? Join the #pyairbyte channel in our Slack workspace.

📝 Edit this welcome message.

Co-Authored-By: AJ Steers <aj@airbyte.io>
@coderabbitai

coderabbitai Bot commented Feb 6, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds structured connection-state models and helpers, API helpers to replace full connection state and catalog (mapping HTTP 423 to a new exception), CloudConnection methods for dumping/importing and per-stream edits, a new AirbyteConnectionSyncActiveError, and unit tests for state models and helpers.

Changes

Cohort / File(s) Summary
API helpers
airbyte/_util/api_util.py
Adds replace_connection_state(...) (POST /v1/state/create_or_update_safe) and replace_connection_catalog(...) (POST /v1/web_backend/connections/update); maps HTTP 423 to AirbyteConnectionSyncActiveError and preserves existing auth flow.
Connection state models
airbyte/cloud/_connection_state.py
New Pydantic models: StreamDescriptor, StreamState, GlobalState, ConnectionStateResponse; adds _match_stream() and _get_stream_list() and __str__ on ConnectionStateResponse.
CloudConnection methods
airbyte/cloud/connections.py
Adds dump_raw_state(), import_raw_state(), get_stream_state(...), set_stream_state(...), dump_raw_catalog(), import_raw_catalog(...); deprecates older artifact helpers, adds logging and input validation, and surfaces HTTP-423 via the new exception.
MCP API update
airbyte/mcp/cloud.py
Narrows get_connection_artifact(...) return type to dict; routes state to dump_raw_state() (treats stateType == "not_set" as missing) and catalog to dump_raw_catalog().
New exception
airbyte/exceptions.py
Adds @dataclass AirbyteConnectionSyncActiveError to represent HTTP 423 "sync running" rejection.
Package init formatting
airbyte/cloud/__init__.py
Reformatted TYPE_CHECKING import block only; no runtime or public-surface change.
Tests
tests/unit_tests/test_connection_state.py
New unit tests covering _match_stream, _get_stream_list, ConnectionStateResponse deserialization and __str__, across stream/global/legacy/not_set cases.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant CloudConnection
    participant StateModels
    participant API as "api_util"
    participant Backend as "Airbyte Backend"

    User->>CloudConnection: dump_raw_state(connection_id)
    CloudConnection->>API: GET connection state
    API->>Backend: GET /state/{connectionId}
    Backend-->>API: ConnectionStateResponse JSON
    API-->>CloudConnection: dict
    CloudConnection->>StateModels: parse -> ConnectionStateResponse

    User->>CloudConnection: set_stream_state(name, new_stream_state)
    CloudConnection->>CloudConnection: dump_raw_state()
    CloudConnection->>StateModels: _get_stream_list() / _match_stream()
    CloudConnection->>CloudConnection: build full state envelope
    CloudConnection->>API: POST replace_connection_state(connection_id, full_state)
    API->>Backend: POST /v1/state/create_or_update_safe
    alt success
        Backend-->>API: updated ConnectionStateResponse JSON
        API-->>CloudConnection: dict
        CloudConnection-->>User: updated state dict
    else 423 LOCKED
        Backend-->>API: HTTP 423
        API-->>CloudConnection: raises AirbyteConnectionSyncActiveError
        CloudConnection-->>User: exception
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Would you like me to add suggested unit tests for the new catalog-replace paths similar to the state tests, wdyt?

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 77.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly matches the main feature: adding state and catalog management methods to CloudConnection.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/1770419251-connection-state-management

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread airbyte/cloud/connections.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@airbyte/cloud/connection_state.py`:
- Around line 110-120: The current _match_stream treats stream_namespace=None as
a wildcard which lets callers (e.g., set_stream_state) match any namespace for a
given stream name; update the _match_stream docstring to explicitly state that
None is treated as a wildcard and will match streams with any namespace, and
update set_stream_state to detect when stream_namespace is None and more than
one matching StreamState exists and emit a warning (or raise/log) so callers are
alerted to potential ambiguity; reference _match_stream and set_stream_state
when making these changes.

In `@airbyte/cloud/connections.py`:
- Around line 543-555: The streamDescriptor currently omits namespace when
stream_namespace is an empty string because the condition uses "if
stream_namespace"; update the conditional to explicitly check for presence using
"if stream_namespace is not None" so that empty-string namespaces are preserved;
modify the construction of new_stream_entry (the streamDescriptor dict creation
around stream_namespace) to use this explicit None check, referencing the
variables new_stream_entry, streamDescriptor, and stream_namespace.
🧹 Nitpick comments (3)
airbyte/_util/api_util.py (1)

2095-2135: Clean addition following existing patterns.

The function mirrors the structure of get_connection_state nicely. One thought: the docstring mentions HTTP 423 behavior, but _make_config_api_request will surface it as a generic AirbyteError. Would it be helpful to catch 423 specifically and raise a more descriptive error (e.g., "Cannot update state while a sync is running") so users get actionable feedback, wdyt?

airbyte/cloud/connections.py (2)

453-478: set_state doesn't validate that connection_state contains a matching connectionId — could this lead to silent mismatches?

The docstring says connectionId inside the dict "Must match this connection's ID," but there's no enforcement. If a caller passes a state dict from a different connection (e.g., copy-paste error), the API would receive a top-level connectionId (from self.connection_id) that might conflict with the one inside connection_state. Depending on which one the API respects, this could either silently do the right thing or corrupt another connection's state. A quick guard here could prevent a painful debugging session, wdyt?

🛡️ Proposed validation
     def set_state(
         self,
         connection_state: dict[str, Any],
     ) -> ConnectionStateResponse:
+        if (
+            "connectionId" in connection_state
+            and connection_state["connectionId"] != self.connection_id
+        ):
+            raise PyAirbyteInputError(
+                message="connectionId in state payload does not match this connection.",
+                context={
+                    "expected": self.connection_id,
+                    "actual": connection_state["connectionId"],
+                },
+            )
         updated_data = api_util.create_or_update_connection_state_safe(

504-583: set_stream_state uses a fetch-modify-push pattern — inherent TOCTOU, but acceptable given the safe endpoint.

The read-modify-write on lines 529→583 means two concurrent set_stream_state calls could race, with the last writer winning. The "safe" endpoint guards against sync-time corruption (423), but not against concurrent client updates. This is likely acceptable for the use case, but maybe worth a brief note in the docstring so callers are aware, wdyt?

Comment thread airbyte/cloud/_connection_state.py Outdated
Comment thread airbyte/cloud/connections.py
Comment thread airbyte/_util/api_util.py Outdated
…m merge

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/cloud/connections.py Outdated
@github-actions

github-actions Bot commented Feb 6, 2026

Copy link
Copy Markdown

PyTest Results (Fast Tests Only, No Creds)

343 tests  +17   343 ✅ +17   5m 40s ⏱️ +8s
  1 suites ± 0     0 💤 ± 0 
  1 files   ± 0     0 ❌ ± 0 

Results for commit 5065c74. ± Comparison against base commit bdffff9.

♻️ This comment has been updated with latest results.

…of Pydantic models

Co-Authored-By: AJ Steers <aj@airbyte.io>
@github-actions

github-actions Bot commented Feb 6, 2026

Copy link
Copy Markdown

PyTest Results (Full)

413 tests  +17   396 ✅ +17   25m 44s ⏱️ + 1m 49s
  1 suites ± 0    17 💤 ± 0 
  1 files   ± 0     0 ❌ ± 0 

Results for commit 5065c74. ± Comparison against base commit bdffff9.

♻️ This comment has been updated with latest results.

…state

Co-Authored-By: AJ Steers <aj@airbyte.io>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@airbyte/cloud/connections.py`:
- Around line 537-548: The loop that replaces matched streams uses _match_stream
with stream_namespace=None as a wildcard, causing multiple streams with the same
name but different namespaces to each be replaced by the one new_stream_entry
and corrupt state; change the logic in the block that iterates over streams
(uses streams, _match_stream, updated_streams_raw, new_stream_entry) to first
collect all matching indices, and if more than one match is found when
stream_namespace is None either raise a clear exception (e.g., ValueError) or
log a warning and abort the replace to avoid duplicating namespace-less entries;
otherwise proceed to replace exactly one matched entry (or append if none) so
you never insert multiple copies of new_stream_entry.
🧹 Nitpick comments (1)
airbyte/_util/api_util.py (1)

2095-2142: Clean implementation, consistent with existing patterns.

The docstring does a great job explaining the full-replacement semantics and the HTTP 423 behavior. One minor thought: the connection_state dict likely contains its own connectionId field, and there's no validation that it matches the connection_id parameter passed to this function. A mismatch could lead to confusing API errors. Would it be worth adding a quick sanity check, or is that better left to the caller, wdyt?

💡 Optional validation
+    # Sanity check: if connectionState includes a connectionId, it should match
+    inner_conn_id = connection_state.get("connectionId")
+    if inner_conn_id and inner_conn_id != connection_id:
+        raise PyAirbyteInputError(
+            message="connectionId in connection_state does not match the connection_id parameter.",
+            context={
+                "connection_id": connection_id,
+                "connection_state_connection_id": inner_conn_id,
+            },
+        )
     return _make_config_api_request(
         path="/state/create_or_update_safe",

Comment thread airbyte/cloud/connections.py
…tate

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/_util/api_util.py Outdated
devin-ai-integration Bot and others added 2 commits February 7, 2026 00:14
…update_connection_state

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/_util/api_util.py Outdated
Comment thread airbyte/_util/api_util.py Outdated
Comment thread airbyte/cloud/connections.py Outdated
…api_util

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/cloud/connections.py Outdated
Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/cloud/connections.py
Comment thread airbyte/cloud/connections.py
…tionSyncActiveError

Co-Authored-By: AJ Steers <aj@airbyte.io>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@airbyte/_util/api_util.py`:
- Around line 2222-2233: The call to _make_config_api_request in the function
that updates connections currently sets "skipReset": False which will trigger a
destination reset; change this to a safer default by making skipReset True or,
better, add a caller-configurable parameter (e.g., skip_reset) to the
surrounding function and pass it through to _make_config_api_request instead of
the hardcoded False; update the call site to set "skipReset": skip_reset
(default True) and adjust any callers/tests accordingly so the reset behavior is
explicit.
🧹 Nitpick comments (1)
airbyte/_util/api_util.py (1)

38-43: Duplicate TYPE_CHECKING block — could you merge these two?

Lines 38-40 and 42-47 both guard if TYPE_CHECKING: imports. The first one imports Callable and the second imports Callable again (plus DestinationConfiguration). This results in a redundant import of Callable and two separate blocks that could be consolidated, wdyt?

🔧 Proposed fix
 if TYPE_CHECKING:
     from collections.abc import Callable
-
-
-if TYPE_CHECKING:
-    from collections.abc import Callable
 
     from airbyte_api.models import (
         DestinationConfiguration,
     )

Comment thread airbyte/_util/api_util.py
Comment thread airbyte/cloud/connections.py
…ethods

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/cloud/connections.py Outdated
Comment thread airbyte/cloud/connections.py Outdated
Comment thread airbyte/cloud/connections.py Outdated
Comment thread airbyte/cloud/connections.py Outdated
…ict, state_blob_dict, configured_catalog_dict)

Co-Authored-By: AJ Steers <aj@airbyte.io>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@airbyte/cloud/connections.py`:
- Around line 547-563: The zip(raw_streams, streams, strict=False) can drop
trailing raw entries when parsed streams are shorter; replace the zip loop with
an index-based loop over raw_streams (e.g., for i, raw_s in
enumerate(raw_streams): parsed_s = streams[i] if i < len(streams) else None) and
then use _match_stream(parsed_s, stream_name, stream_namespace) (or check
parsed_s is not None before matching) to decide whether to append
new_stream_entry or raw_s to updated_streams_raw; this ensures no raw_streams
are silently dropped if _get_stream_list(current) returns fewer entries.
- Around line 618-640: import_raw_catalog currently calls
replace_connection_catalog directly and will surface a generic AirbyteError when
the backend returns HTTP 423; update replace_connection_catalog (or wrap its
call inside import_raw_catalog) to mirror the HTTP 423 handling used by
replace_connection_state/import_raw_state by catching the error from
replace_connection_catalog and raising AirbyteConnectionSyncActiveError when the
response indicates a sync is active (HTTP 423). Locate the call to
replace_connection_catalog in import_raw_catalog and either add the same
try/except that maps 423 → AirbyteConnectionSyncActiveError (reusing the exact
logic from replace_connection_state) or modify replace_connection_catalog to
perform that mapping so both import_raw_catalog and existing callers receive the
clearer sync-active exception.
🧹 Nitpick comments (1)
airbyte/_util/api_util.py (1)

1467-1472: No timeout on the requests.request() call — could block indefinitely.

_make_config_api_request doesn't pass a timeout to requests.request(). If the config API hangs, callers (including the new state/catalog methods) would block forever. Would adding a reasonable default timeout (e.g., timeout=60) be worth considering here, wdyt?

🔧 Proposed fix
     response = requests.request(
         method="POST",
         url=full_url,
         headers=headers,
         json=json,
+        timeout=60,
     )

Comment thread airbyte/cloud/connections.py
Comment thread airbyte/cloud/connections.py
@devin-ai-integration devin-ai-integration Bot changed the title feat(cloud): add connection state management to CloudConnection class feat(cloud): add connection state and catalog management to CloudConnection Feb 7, 2026
Comment thread airbyte/cloud/connections.py
Comment thread airbyte/cloud/connections.py Outdated
devin-ai-integration Bot and others added 2 commits February 7, 2026 02:23
…t destructive resets

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/_util/api_util.py

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 13 additional findings in Devin Review.

Open in Devin Review

Comment thread airbyte/cloud/connections.py
@devin-ai-integration

Copy link
Copy Markdown
Contributor
Responses to remaining CodeRabbit nitpick suggestions

Duplicate TYPE_CHECKING blocks in api_util.py (lines 38-43) — This is pre-existing code, not introduced by this PR. Could be cleaned up separately but out of scope here.

No timeout on requests.request() in _make_config_api_request — Also pre-existing and affects all config API calls, not just the new state/catalog methods. Worth addressing separately but out of scope for this PR.

Multiple matches debug log in get_stream_state — Valid suggestion but extremely unlikely in practice (would require duplicate stream entries in the API response, which the platform doesn't produce). Fine as-is for now.

Co-Authored-By: AJ Steers <aj@airbyte.io>

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 17 additional findings in Devin Review.

Open in Devin Review

Comment thread airbyte/cloud/connections.py
@aaronsteers Aaron ("AJ") Steers (aaronsteers) merged commit e48484f into main Feb 7, 2026
22 checks passed
@aaronsteers Aaron ("AJ") Steers (aaronsteers) deleted the devin/1770419251-connection-state-management branch February 7, 2026 06:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant