From 9d2693e3daee08d326f391cbb8622197347c975e Mon Sep 17 00:00:00 2001 From: sahil-roe <253115704+sahil-roe@users.noreply.github.com> Date: Tue, 10 Nov 2026 00:51:31 +0000 Subject: [PATCH] Release v1.1.22 --- .roe-main-release-version | 2 +- README.md | 2 +- SDK_EXAMPLES.md | 5 + openapi/openapi.yml | 78 ++++++++++-- openapi/wrappers.yml | 36 +++++- pyproject.toml | 2 +- .../api/connections/connections_list.py | 15 +++ .../connections/connections_partial_update.py | 24 ++-- .../api/connections/connections_update.py | 24 ++-- src/roe/_generated/models/__init__.py | 4 + src/roe/_generated/models/connection.py | 23 ++++ src/roe/_generated/models/connection_list.py | 23 ++++ .../connection_update_conflict_response.py | 113 ++++++++++++++++++ src/roe/_generated/models/lifecycle_enum.py | 9 ++ src/roe/_generated/models/list_agent_job.py | 28 +++++ .../patched_update_connection_request.py | 33 +++++ .../models/update_connection_request.py | 33 +++++ src/roe/api/connections.py | 20 +++- uv.lock | 2 +- 19 files changed, 433 insertions(+), 43 deletions(-) create mode 100644 src/roe/_generated/models/connection_update_conflict_response.py create mode 100644 src/roe/_generated/models/lifecycle_enum.py diff --git a/.roe-main-release-version b/.roe-main-release-version index a3626bf..b598ce3 100644 --- a/.roe-main-release-version +++ b/.roe-main-release-version @@ -1 +1 @@ -1-1-4 +1-1-5 diff --git a/README.md b/README.md index c265890..a45fbcf 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A Python SDK for the [Roe](https://www.roe-ai.com/) API. -> **v1.1.21** - SDK operation coverage is synchronized across Python, +> **v1.1.22** - SDK operation coverage is synchronized across Python, > TypeScript, and Go. See `SDK_EXAMPLES.md` for copy-ready examples and > use cases. diff --git a/SDK_EXAMPLES.md b/SDK_EXAMPLES.md index d159147..0396297 100644 --- a/SDK_EXAMPLES.md +++ b/SDK_EXAMPLES.md @@ -502,6 +502,7 @@ result = client.connections.list( search="search", # optional page=1, # optional page_size=1, # optional + lifecycle="lifecycle", # optional ) ``` @@ -585,6 +586,8 @@ result = client.connections.update( config={}, # optional auth_config={}, # optional dynamic_inputs={}, # optional + lifecycle="lifecycle", # optional + confirm_in_use=True, # optional ) ``` @@ -604,6 +607,8 @@ result = client.connections.replace( config={}, # optional auth_config={}, # optional dynamic_inputs={}, # optional + lifecycle="lifecycle", # optional + confirm_in_use=True, # optional ) ``` diff --git a/openapi/openapi.yml b/openapi/openapi.yml index 0eb3de1..aa61155 100644 --- a/openapi/openapi.yml +++ b/openapi/openapi.yml @@ -2388,6 +2388,13 @@ paths: schema: type: string description: Filter by connector type (e.g., 'snowflake', 'postgres') + - in: query + name: lifecycle + schema: + type: string + description: 'Filter by lifecycle: active, archived or disconnected. Pickers + ask for ''active'' so archived and disconnected connections can''t be chosen + again.' - name: ordering required: false in: query @@ -2643,10 +2650,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/DuplicateConnectionResponse' - description: A strict-identity duplicate of this connection already exists - in this organization, or post actions still call a write operation this - update removes or renames ({error}). + $ref: '#/components/schemas/ConnectionUpdateConflictResponse' + description: 'A strict-identity duplicate of this connection already exists + in this organization, post actions still call a write operation this update + removes or renames ({error}), or the update changes calls for agents or + webhooks that use the connection ({error, in_use: true}; resend with confirm_in_use).' patch: operationId: connections_partial_update description: 'Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage @@ -2725,10 +2733,11 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/DuplicateConnectionResponse' - description: A strict-identity duplicate of this connection already exists - in this organization, or post actions still call a write operation this - update removes or renames ({error}). + $ref: '#/components/schemas/ConnectionUpdateConflictResponse' + description: 'A strict-identity duplicate of this connection already exists + in this organization, post actions still call a write operation this update + removes or renames ({error}), or the update changes calls for agents or + webhooks that use the connection ({error, in_use: true}; resend with confirm_in_use).' delete: operationId: connections_destroy description: 'Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage @@ -2773,7 +2782,7 @@ paths: application/json: schema: $ref: '#/components/schemas/ConnectionDeleteErrorResponse' - description: Post actions still reference this connection. + description: Agents or webhooks still use this connection. '500': content: application/json: @@ -5817,6 +5826,8 @@ components: readOnly: true status: $ref: '#/components/schemas/StatusEnum' + lifecycle: + $ref: '#/components/schemas/LifecycleEnum' created_at: type: string format: date-time @@ -5924,6 +5935,8 @@ components: readOnly: true status: $ref: '#/components/schemas/StatusEnum' + lifecycle: + $ref: '#/components/schemas/LifecycleEnum' created_at: type: string format: date-time @@ -5977,6 +5990,23 @@ components: - connection_id - operation type: object + ConnectionUpdateConflictResponse: + type: object + description: Body of a 409 from update/replace; which fields are set depends + on the cause. + properties: + error: + type: string + existing_connection: + allOf: + - $ref: '#/components/schemas/DuplicateConnectionExisting' + description: Set when an identical connection already exists. + in_use: + type: boolean + description: True when agents or webhooks use the settings being changed; + resend with confirm_in_use to save anyway. + required: + - error ConnectorBrowserSession: type: object properties: @@ -6684,6 +6714,16 @@ components: - description - key - value + LifecycleEnum: + enum: + - active + - archived + - disconnected + type: string + description: |- + * `active` - Active + * `archived` - Archived + * `disconnected` - Disconnected ListAgentJob: type: object properties: @@ -6691,6 +6731,13 @@ components: type: string format: uuid readOnly: true + agent_version_id: + type: + - string + - 'null' + format: uuid + readOnly: true + description: ID of the agent version the job ran on agent_version_name: type: - string @@ -6755,6 +6802,7 @@ components: - type: 'null' readOnly: true required: + - agent_version_id - agent_version_name - created_at - creator @@ -7151,6 +7199,12 @@ components: additionalProperties: type: string minLength: 1 + lifecycle: + $ref: '#/components/schemas/LifecycleEnum' + confirm_in_use: + type: boolean + description: Save a config change that alters calls for agents or webhooks + that already use the connection. PatchedUpdatePolicyRequest: type: object description: Serializer for updating policy metadata (name, description) @@ -8111,6 +8165,12 @@ components: additionalProperties: type: string minLength: 1 + lifecycle: + $ref: '#/components/schemas/LifecycleEnum' + confirm_in_use: + type: boolean + description: Save a config change that alters calls for agents or webhooks + that already use the connection. UpdatePolicy: type: object description: Serializer for updating policy metadata (name, description) diff --git a/openapi/wrappers.yml b/openapi/wrappers.yml index c79a404..77892e8 100644 --- a/openapi/wrappers.yml +++ b/openapi/wrappers.yml @@ -687,6 +687,12 @@ apis: annotation: int | None default: null pass_unset_when_none: true + - name: lifecycle + location: query + wire_name: lifecycle + annotation: str | None + default: null + pass_unset_when_none: true - kind: body method_name: create docstring: Create a connection. @@ -774,7 +780,7 @@ apis: annotation: str - kind: body method_name: update - docstring: Update mutable connection fields. + docstring: Update mutable connection fields. Changing settings agents already use needs confirm_in_use. method: PATCH path: /v1/connections/{id}/ endpoint_module: roe._generated.api.connections.connections_partial_update @@ -817,9 +823,21 @@ apis: annotation: dict[str, str] | None default: null pass_unset_when_none: true + - name: lifecycle + location: body + wire_name: lifecycle + annotation: str | None + default: null + pass_unset_when_none: true + - name: confirm_in_use + location: body + wire_name: confirm_in_use + annotation: bool | None + default: null + pass_unset_when_none: true - kind: body method_name: replace - docstring: Replace a connection. + docstring: Replace a connection. Changing settings agents already use needs confirm_in_use. method: PUT path: /v1/connections/{id}/ endpoint_module: roe._generated.api.connections.connections_update @@ -862,9 +880,21 @@ apis: annotation: dict[str, str] | None default: null pass_unset_when_none: true + - name: lifecycle + location: body + wire_name: lifecycle + annotation: str | None + default: null + pass_unset_when_none: true + - name: confirm_in_use + location: body + wire_name: confirm_in_use + annotation: bool | None + default: null + pass_unset_when_none: true - kind: body method_name: delete - docstring: Delete a connection. + docstring: Delete a connection. Refused while agents or webhooks use it. method: DELETE path: /v1/connections/{id}/ endpoint_module: roe._generated.api.connections.connections_destroy diff --git a/pyproject.toml b/pyproject.toml index ccdb0cd..1f5127a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "roe-ai" -version = "1.1.21" +version = "1.1.22" authors = [ { name = "Roe", email = "founders@roe-ai.com" }, ] diff --git a/src/roe/_generated/api/connections/connections_list.py b/src/roe/_generated/api/connections/connections_list.py index 104d0b6..efae0e4 100644 --- a/src/roe/_generated/api/connections/connections_list.py +++ b/src/roe/_generated/api/connections/connections_list.py @@ -20,6 +20,7 @@ def _get_kwargs( *, connector_type: str | Unset = UNSET, + lifecycle: str | Unset = UNSET, ordering: str | Unset = UNSET, organization_id: UUID | Unset = UNSET, page: int | Unset = UNSET, @@ -35,6 +36,8 @@ def _get_kwargs( params["connector_type"] = connector_type + params["lifecycle"] = lifecycle + params["ordering"] = ordering json_organization_id: str | Unset = UNSET @@ -111,6 +114,7 @@ def sync_detailed( *, client: AuthenticatedClient, connector_type: str | Unset = UNSET, + lifecycle: str | Unset = UNSET, ordering: str | Unset = UNSET, organization_id: UUID | Unset = UNSET, page: int | Unset = UNSET, @@ -122,6 +126,7 @@ def sync_detailed( Args: connector_type (str | Unset): + lifecycle (str | Unset): ordering (str | Unset): organization_id (UUID | Unset): page (int | Unset): @@ -139,6 +144,7 @@ def sync_detailed( kwargs = _get_kwargs( connector_type=connector_type, +lifecycle=lifecycle, ordering=ordering, organization_id=organization_id, page=page, @@ -157,6 +163,7 @@ def sync( *, client: AuthenticatedClient, connector_type: str | Unset = UNSET, + lifecycle: str | Unset = UNSET, ordering: str | Unset = UNSET, organization_id: UUID | Unset = UNSET, page: int | Unset = UNSET, @@ -168,6 +175,7 @@ def sync( Args: connector_type (str | Unset): + lifecycle (str | Unset): ordering (str | Unset): organization_id (UUID | Unset): page (int | Unset): @@ -186,6 +194,7 @@ def sync( return sync_detailed( client=client, connector_type=connector_type, +lifecycle=lifecycle, ordering=ordering, organization_id=organization_id, page=page, @@ -198,6 +207,7 @@ async def asyncio_detailed( *, client: AuthenticatedClient, connector_type: str | Unset = UNSET, + lifecycle: str | Unset = UNSET, ordering: str | Unset = UNSET, organization_id: UUID | Unset = UNSET, page: int | Unset = UNSET, @@ -209,6 +219,7 @@ async def asyncio_detailed( Args: connector_type (str | Unset): + lifecycle (str | Unset): ordering (str | Unset): organization_id (UUID | Unset): page (int | Unset): @@ -226,6 +237,7 @@ async def asyncio_detailed( kwargs = _get_kwargs( connector_type=connector_type, +lifecycle=lifecycle, ordering=ordering, organization_id=organization_id, page=page, @@ -244,6 +256,7 @@ async def asyncio( *, client: AuthenticatedClient, connector_type: str | Unset = UNSET, + lifecycle: str | Unset = UNSET, ordering: str | Unset = UNSET, organization_id: UUID | Unset = UNSET, page: int | Unset = UNSET, @@ -255,6 +268,7 @@ async def asyncio( Args: connector_type (str | Unset): + lifecycle (str | Unset): ordering (str | Unset): organization_id (UUID | Unset): page (int | Unset): @@ -273,6 +287,7 @@ async def asyncio( return (await asyncio_detailed( client=client, connector_type=connector_type, +lifecycle=lifecycle, ordering=ordering, organization_id=organization_id, page=page, diff --git a/src/roe/_generated/api/connections/connections_partial_update.py b/src/roe/_generated/api/connections/connections_partial_update.py index e7c47cf..a43a5d5 100644 --- a/src/roe/_generated/api/connections/connections_partial_update.py +++ b/src/roe/_generated/api/connections/connections_partial_update.py @@ -9,9 +9,9 @@ from ... import errors from ...models.connection import Connection +from ...models.connection_update_conflict_response import ConnectionUpdateConflictResponse from ...models.connections_partial_update_response_400_type_1 import ConnectionsPartialUpdateResponse400Type1 from ...models.connections_partial_update_response_400_type_2 import ConnectionsPartialUpdateResponse400Type2 -from ...models.duplicate_connection_response import DuplicateConnectionResponse from ...models.error_detail_response import ErrorDetailResponse from ...models.patched_update_connection_request import PatchedUpdateConnectionRequest from ...types import UNSET, Unset @@ -61,7 +61,7 @@ def _get_kwargs( -def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: if response.status_code == 200: response_200 = Connection.from_dict(response.json()) @@ -109,7 +109,7 @@ def _parse_response_400(data: object) -> ConnectionsPartialUpdateResponse400Type return response_404 if response.status_code == 409: - response_409 = DuplicateConnectionResponse.from_dict(response.json()) + response_409 = ConnectionUpdateConflictResponse.from_dict(response.json()) @@ -121,7 +121,7 @@ def _parse_response_400(data: object) -> ConnectionsPartialUpdateResponse400Type return None -def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -137,7 +137,7 @@ def sync_detailed( body: PatchedUpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Response[Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -161,7 +161,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse] + Response[Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse] """ @@ -185,7 +185,7 @@ def sync( body: PatchedUpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +) -> Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -209,7 +209,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse + Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse """ @@ -228,7 +228,7 @@ async def asyncio_detailed( body: PatchedUpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Response[Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -252,7 +252,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse] + Response[Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse] """ @@ -276,7 +276,7 @@ async def asyncio( body: PatchedUpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +) -> Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -300,7 +300,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Connection | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse + Connection | ConnectionUpdateConflictResponse | ConnectionsPartialUpdateResponse400Type1 | ConnectionsPartialUpdateResponse400Type2 | list[str] | ErrorDetailResponse """ diff --git a/src/roe/_generated/api/connections/connections_update.py b/src/roe/_generated/api/connections/connections_update.py index d934543..5662502 100644 --- a/src/roe/_generated/api/connections/connections_update.py +++ b/src/roe/_generated/api/connections/connections_update.py @@ -9,9 +9,9 @@ from ... import errors from ...models.connection import Connection +from ...models.connection_update_conflict_response import ConnectionUpdateConflictResponse from ...models.connections_update_response_400_type_1 import ConnectionsUpdateResponse400Type1 from ...models.connections_update_response_400_type_2 import ConnectionsUpdateResponse400Type2 -from ...models.duplicate_connection_response import DuplicateConnectionResponse from ...models.error_detail_response import ErrorDetailResponse from ...models.update_connection_request import UpdateConnectionRequest from ...types import UNSET, Unset @@ -61,7 +61,7 @@ def _get_kwargs( -def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: if response.status_code == 200: response_200 = Connection.from_dict(response.json()) @@ -109,7 +109,7 @@ def _parse_response_400(data: object) -> ConnectionsUpdateResponse400Type1 | Con return response_404 if response.status_code == 409: - response_409 = DuplicateConnectionResponse.from_dict(response.json()) + response_409 = ConnectionUpdateConflictResponse.from_dict(response.json()) @@ -121,7 +121,7 @@ def _parse_response_400(data: object) -> ConnectionsUpdateResponse400Type1 | Con return None -def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: return Response( status_code=HTTPStatus(response.status_code), content=response.content, @@ -137,7 +137,7 @@ def sync_detailed( body: UpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Response[Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -161,7 +161,7 @@ def sync_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse] + Response[Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse] """ @@ -185,7 +185,7 @@ def sync( body: UpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +) -> Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -209,7 +209,7 @@ def sync( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse + Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse """ @@ -228,7 +228,7 @@ async def asyncio_detailed( body: UpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Response[Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse]: +) -> Response[Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse]: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -252,7 +252,7 @@ async def asyncio_detailed( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Response[Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse] + Response[Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse] """ @@ -276,7 +276,7 @@ async def asyncio( body: UpdateConnectionRequest | Unset = UNSET, organization_id: UUID | Unset = UNSET, -) -> Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse | None: +) -> Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse | None: """ Public API: GET/PATCH/DELETE /api/v1/connections/{id}/ - Manage connection. Args: @@ -300,7 +300,7 @@ async def asyncio( httpx.TimeoutException: If the request takes longer than Client.timeout. Returns: - Connection | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | DuplicateConnectionResponse | ErrorDetailResponse + Connection | ConnectionUpdateConflictResponse | ConnectionsUpdateResponse400Type1 | ConnectionsUpdateResponse400Type2 | list[str] | ErrorDetailResponse """ diff --git a/src/roe/_generated/models/__init__.py b/src/roe/_generated/models/__init__.py index b6696c8..d75218a 100644 --- a/src/roe/_generated/models/__init__.py +++ b/src/roe/_generated/models/__init__.py @@ -66,6 +66,7 @@ from .connection_list_dynamic_inputs import ConnectionListDynamicInputs from .connection_step import ConnectionStep from .connection_step_input_mapping import ConnectionStepInputMapping +from .connection_update_conflict_response import ConnectionUpdateConflictResponse from .connections_create_response_400_type_1 import ConnectionsCreateResponse400Type1 from .connections_create_response_400_type_2 import ConnectionsCreateResponse400Type2 from .connections_list_response_400 import ConnectionsListResponse400 @@ -109,6 +110,7 @@ from .if_block import IfBlock from .input_field import InputField from .job_input import JobInput +from .lifecycle_enum import LifecycleEnum from .list_agent_job import ListAgentJob from .list_agent_job_metadata import ListAgentJobMetadata from .merge_step import MergeStep @@ -312,6 +314,7 @@ "ConnectionsTestCredentialsCreateResponse400Type1", "ConnectionsUpdateResponse400Type1", "ConnectionsUpdateResponse400Type2", + "ConnectionUpdateConflictResponse", "ConnectorBrowserSession", "ConnectorBrowserSessionRequiredConfig", "ConnectorListResponse", @@ -346,6 +349,7 @@ "IfBlock", "InputField", "JobInput", + "LifecycleEnum", "ListAgentJob", "ListAgentJobMetadata", "MergeStep", diff --git a/src/roe/_generated/models/connection.py b/src/roe/_generated/models/connection.py index 74ef871..9578955 100644 --- a/src/roe/_generated/models/connection.py +++ b/src/roe/_generated/models/connection.py @@ -8,6 +8,7 @@ from ..types import UNSET, Unset +from ..models.lifecycle_enum import LifecycleEnum from ..models.status_enum import StatusEnum from ..types import UNSET, Unset from dateutil.parser import isoparse @@ -52,6 +53,9 @@ class Connection: config (Any | Unset): status (StatusEnum | Unset): * `active` - Active * `error` - Error + lifecycle (LifecycleEnum | Unset): * `active` - Active + * `archived` - Archived + * `disconnected` - Disconnected """ id: UUID @@ -70,6 +74,7 @@ class Connection: description: str | Unset = UNSET config: Any | Unset = UNSET status: StatusEnum | Unset = UNSET + lifecycle: LifecycleEnum | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -120,6 +125,11 @@ def to_dict(self) -> dict[str, Any]: status = self.status.value + lifecycle: str | Unset = UNSET + if not isinstance(self.lifecycle, Unset): + lifecycle = self.lifecycle.value + + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -144,6 +154,8 @@ def to_dict(self) -> dict[str, Any]: field_dict["config"] = config if status is not UNSET: field_dict["status"] = status + if lifecycle is not UNSET: + field_dict["lifecycle"] = lifecycle return field_dict @@ -240,6 +252,16 @@ def _parse_browser_session_expires_at(data: object) -> datetime.datetime | None: + _lifecycle = d.pop("lifecycle", UNSET) + lifecycle: LifecycleEnum | Unset + if isinstance(_lifecycle, Unset): + lifecycle = UNSET + else: + lifecycle = LifecycleEnum(_lifecycle) + + + + connection = cls( id=id, user=user, @@ -257,6 +279,7 @@ def _parse_browser_session_expires_at(data: object) -> datetime.datetime | None: description=description, config=config, status=status, + lifecycle=lifecycle, ) diff --git a/src/roe/_generated/models/connection_list.py b/src/roe/_generated/models/connection_list.py index f23deb6..d045a2f 100644 --- a/src/roe/_generated/models/connection_list.py +++ b/src/roe/_generated/models/connection_list.py @@ -8,6 +8,7 @@ from ..types import UNSET, Unset +from ..models.lifecycle_enum import LifecycleEnum from ..models.status_enum import StatusEnum from ..types import UNSET, Unset from dateutil.parser import isoparse @@ -47,6 +48,9 @@ class ConnectionList: config (Any | Unset): status (StatusEnum | Unset): * `active` - Active * `error` - Error + lifecycle (LifecycleEnum | Unset): * `active` - Active + * `archived` - Archived + * `disconnected` - Disconnected """ id: UUID @@ -63,6 +67,7 @@ class ConnectionList: description: str | Unset = UNSET config: Any | Unset = UNSET status: StatusEnum | Unset = UNSET + lifecycle: LifecycleEnum | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -104,6 +109,11 @@ def to_dict(self) -> dict[str, Any]: status = self.status.value + lifecycle: str | Unset = UNSET + if not isinstance(self.lifecycle, Unset): + lifecycle = self.lifecycle.value + + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -126,6 +136,8 @@ def to_dict(self) -> dict[str, Any]: field_dict["config"] = config if status is not UNSET: field_dict["status"] = status + if lifecycle is not UNSET: + field_dict["lifecycle"] = lifecycle return field_dict @@ -198,6 +210,16 @@ def _parse_dynamic_input_test_disabled_reason(data: object) -> None | str: + _lifecycle = d.pop("lifecycle", UNSET) + lifecycle: LifecycleEnum | Unset + if isinstance(_lifecycle, Unset): + lifecycle = UNSET + else: + lifecycle = LifecycleEnum(_lifecycle) + + + + connection_list = cls( id=id, user=user, @@ -213,6 +235,7 @@ def _parse_dynamic_input_test_disabled_reason(data: object) -> None | str: description=description, config=config, status=status, + lifecycle=lifecycle, ) diff --git a/src/roe/_generated/models/connection_update_conflict_response.py b/src/roe/_generated/models/connection_update_conflict_response.py new file mode 100644 index 0000000..86e7ec1 --- /dev/null +++ b/src/roe/_generated/models/connection_update_conflict_response.py @@ -0,0 +1,113 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..types import UNSET, Unset +from typing import cast + +if TYPE_CHECKING: + from ..models.duplicate_connection_existing import DuplicateConnectionExisting + + + + + +T = TypeVar("T", bound="ConnectionUpdateConflictResponse") + + + +@_attrs_define +class ConnectionUpdateConflictResponse: + """ Body of a 409 from update/replace; which fields are set depends on the cause. + + Attributes: + error (str): + existing_connection (DuplicateConnectionExisting | Unset): Identifying summary of the existing connection that + triggered a 409. + in_use (bool | Unset): True when agents or webhooks use the settings being changed; resend with confirm_in_use + to save anyway. + """ + + error: str + existing_connection: DuplicateConnectionExisting | Unset = UNSET + in_use: bool | Unset = UNSET + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.duplicate_connection_existing import DuplicateConnectionExisting + error = self.error + + existing_connection: dict[str, Any] | Unset = UNSET + if not isinstance(self.existing_connection, Unset): + existing_connection = self.existing_connection.to_dict() + + in_use = self.in_use + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "error": error, + }) + if existing_connection is not UNSET: + field_dict["existing_connection"] = existing_connection + if in_use is not UNSET: + field_dict["in_use"] = in_use + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.duplicate_connection_existing import DuplicateConnectionExisting + d = dict(src_dict) + error = d.pop("error") + + _existing_connection = d.pop("existing_connection", UNSET) + existing_connection: DuplicateConnectionExisting | Unset + if isinstance(_existing_connection, Unset): + existing_connection = UNSET + else: + existing_connection = DuplicateConnectionExisting.from_dict(_existing_connection) + + + + + in_use = d.pop("in_use", UNSET) + + connection_update_conflict_response = cls( + error=error, + existing_connection=existing_connection, + in_use=in_use, + ) + + + connection_update_conflict_response.additional_properties = d + return connection_update_conflict_response + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/src/roe/_generated/models/lifecycle_enum.py b/src/roe/_generated/models/lifecycle_enum.py new file mode 100644 index 0000000..125e0d1 --- /dev/null +++ b/src/roe/_generated/models/lifecycle_enum.py @@ -0,0 +1,9 @@ +from enum import Enum + +class LifecycleEnum(str, Enum): + ACTIVE = "active" + ARCHIVED = "archived" + DISCONNECTED = "disconnected" + + def __str__(self) -> str: + return str(self.value) diff --git a/src/roe/_generated/models/list_agent_job.py b/src/roe/_generated/models/list_agent_job.py index 62494c7..934cf42 100644 --- a/src/roe/_generated/models/list_agent_job.py +++ b/src/roe/_generated/models/list_agent_job.py @@ -36,6 +36,7 @@ class ListAgentJob: """ Attributes: id (UUID): + agent_version_id (None | UUID): ID of the agent version the job ran on agent_version_name (None | str): Get the agent version name, handling null agent and annotation. status_events (list[PublicAgentJobStatusEvent]): status_code (int): Current status code of the job (0=PENDING, 1=STARTED, 2=RETRY, 3=SUCCESS, 4=FAILURE, @@ -57,6 +58,7 @@ class ListAgentJob: """ id: UUID + agent_version_id: None | UUID agent_version_name: None | str status_events: list[PublicAgentJobStatusEvent] status_code: int @@ -85,6 +87,12 @@ def to_dict(self) -> dict[str, Any]: from ..models.user_info import UserInfo id = str(self.id) + agent_version_id: None | str + if isinstance(self.agent_version_id, UUID): + agent_version_id = str(self.agent_version_id) + else: + agent_version_id = self.agent_version_id + agent_version_name: None | str agent_version_name = self.agent_version_name @@ -144,6 +152,7 @@ def to_dict(self) -> dict[str, Any]: field_dict.update(self.additional_properties) field_dict.update({ "id": id, + "agent_version_id": agent_version_id, "agent_version_name": agent_version_name, "status_events": status_events, "status_code": status_code, @@ -179,6 +188,24 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + def _parse_agent_version_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + agent_version_id_type_0 = UUID(data) + + + + return agent_version_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + agent_version_id = _parse_agent_version_id(d.pop("agent_version_id")) + + def _parse_agent_version_name(data: object) -> None | str: if data is None: return data @@ -302,6 +329,7 @@ def _parse_creator(data: object) -> None | UserInfo: list_agent_job = cls( id=id, + agent_version_id=agent_version_id, agent_version_name=agent_version_name, status_events=status_events, status_code=status_code, diff --git a/src/roe/_generated/models/patched_update_connection_request.py b/src/roe/_generated/models/patched_update_connection_request.py index d0e1bbe..ce2d681 100644 --- a/src/roe/_generated/models/patched_update_connection_request.py +++ b/src/roe/_generated/models/patched_update_connection_request.py @@ -8,6 +8,7 @@ from ..types import UNSET, Unset +from ..models.lifecycle_enum import LifecycleEnum from ..types import UNSET, Unset from typing import cast @@ -45,6 +46,11 @@ class PatchedUpdateConnectionRequest: config (PatchedUpdateConnectionRequestConfig | Unset): auth_config (PatchedUpdateConnectionRequestAuthConfig | Unset): dynamic_inputs (PatchedUpdateConnectionRequestDynamicInputs | Unset): + lifecycle (LifecycleEnum | Unset): * `active` - Active + * `archived` - Archived + * `disconnected` - Disconnected + confirm_in_use (bool | Unset): Save a config change that alters calls for agents or webhooks that already use + the connection. """ name: str | Unset = UNSET @@ -52,6 +58,8 @@ class PatchedUpdateConnectionRequest: config: PatchedUpdateConnectionRequestConfig | Unset = UNSET auth_config: PatchedUpdateConnectionRequestAuthConfig | Unset = UNSET dynamic_inputs: PatchedUpdateConnectionRequestDynamicInputs | Unset = UNSET + lifecycle: LifecycleEnum | Unset = UNSET + confirm_in_use: bool | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -78,6 +86,13 @@ def to_dict(self) -> dict[str, Any]: if not isinstance(self.dynamic_inputs, Unset): dynamic_inputs = self.dynamic_inputs.to_dict() + lifecycle: str | Unset = UNSET + if not isinstance(self.lifecycle, Unset): + lifecycle = self.lifecycle.value + + + confirm_in_use = self.confirm_in_use + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -93,6 +108,10 @@ def to_dict(self) -> dict[str, Any]: field_dict["auth_config"] = auth_config if dynamic_inputs is not UNSET: field_dict["dynamic_inputs"] = dynamic_inputs + if lifecycle is not UNSET: + field_dict["lifecycle"] = lifecycle + if confirm_in_use is not UNSET: + field_dict["confirm_in_use"] = confirm_in_use return field_dict @@ -138,12 +157,26 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + _lifecycle = d.pop("lifecycle", UNSET) + lifecycle: LifecycleEnum | Unset + if isinstance(_lifecycle, Unset): + lifecycle = UNSET + else: + lifecycle = LifecycleEnum(_lifecycle) + + + + + confirm_in_use = d.pop("confirm_in_use", UNSET) + patched_update_connection_request = cls( name=name, description=description, config=config, auth_config=auth_config, dynamic_inputs=dynamic_inputs, + lifecycle=lifecycle, + confirm_in_use=confirm_in_use, ) diff --git a/src/roe/_generated/models/update_connection_request.py b/src/roe/_generated/models/update_connection_request.py index 13f9a4c..d0836b8 100644 --- a/src/roe/_generated/models/update_connection_request.py +++ b/src/roe/_generated/models/update_connection_request.py @@ -8,6 +8,7 @@ from ..types import UNSET, Unset +from ..models.lifecycle_enum import LifecycleEnum from ..types import UNSET, Unset from typing import cast @@ -45,6 +46,11 @@ class UpdateConnectionRequest: config (UpdateConnectionRequestConfig | Unset): auth_config (UpdateConnectionRequestAuthConfig | Unset): dynamic_inputs (UpdateConnectionRequestDynamicInputs | Unset): + lifecycle (LifecycleEnum | Unset): * `active` - Active + * `archived` - Archived + * `disconnected` - Disconnected + confirm_in_use (bool | Unset): Save a config change that alters calls for agents or webhooks that already use + the connection. """ name: str | Unset = UNSET @@ -52,6 +58,8 @@ class UpdateConnectionRequest: config: UpdateConnectionRequestConfig | Unset = UNSET auth_config: UpdateConnectionRequestAuthConfig | Unset = UNSET dynamic_inputs: UpdateConnectionRequestDynamicInputs | Unset = UNSET + lifecycle: LifecycleEnum | Unset = UNSET + confirm_in_use: bool | Unset = UNSET additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) @@ -78,6 +86,13 @@ def to_dict(self) -> dict[str, Any]: if not isinstance(self.dynamic_inputs, Unset): dynamic_inputs = self.dynamic_inputs.to_dict() + lifecycle: str | Unset = UNSET + if not isinstance(self.lifecycle, Unset): + lifecycle = self.lifecycle.value + + + confirm_in_use = self.confirm_in_use + field_dict: dict[str, Any] = {} field_dict.update(self.additional_properties) @@ -93,6 +108,10 @@ def to_dict(self) -> dict[str, Any]: field_dict["auth_config"] = auth_config if dynamic_inputs is not UNSET: field_dict["dynamic_inputs"] = dynamic_inputs + if lifecycle is not UNSET: + field_dict["lifecycle"] = lifecycle + if confirm_in_use is not UNSET: + field_dict["confirm_in_use"] = confirm_in_use return field_dict @@ -138,12 +157,26 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + _lifecycle = d.pop("lifecycle", UNSET) + lifecycle: LifecycleEnum | Unset + if isinstance(_lifecycle, Unset): + lifecycle = UNSET + else: + lifecycle = LifecycleEnum(_lifecycle) + + + + + confirm_in_use = d.pop("confirm_in_use", UNSET) + update_connection_request = cls( name=name, description=description, config=config, auth_config=auth_config, dynamic_inputs=dynamic_inputs, + lifecycle=lifecycle, + confirm_in_use=confirm_in_use, ) diff --git a/src/roe/api/connections.py b/src/roe/api/connections.py index eedde28..381e5b8 100644 --- a/src/roe/api/connections.py +++ b/src/roe/api/connections.py @@ -46,6 +46,7 @@ def list( search: str | None = None, page: int | None = None, page_size: int | None = None, + lifecycle: str | None = None, ) -> PaginatedConnectionListList: """List connections.""" response = request_raw( @@ -55,6 +56,7 @@ def list( search=search if search is not None else UNSET, page=page if page is not None else UNSET, page_size=page_size if page_size is not None else UNSET, + lifecycle=lifecycle if lifecycle is not None else UNSET, organization_id=self._org_id, ) return PaginatedConnectionListList.from_dict(response.json()) @@ -131,8 +133,10 @@ def update( config: dict[str, Any] | None = None, auth_config: dict[str, Any] | None = None, dynamic_inputs: dict[str, str] | None = None, + lifecycle: str | None = None, + confirm_in_use: bool | None = None, ) -> Connection: - """Update mutable connection fields.""" + """Update mutable connection fields. Changing settings agents already use needs confirm_in_use.""" body: dict[str, Any] = {} if name is not None: body["name"] = name @@ -144,6 +148,10 @@ def update( body["auth_config"] = auth_config if dynamic_inputs is not None: body["dynamic_inputs"] = dynamic_inputs + if lifecycle is not None: + body["lifecycle"] = lifecycle + if confirm_in_use is not None: + body["confirm_in_use"] = confirm_in_use resp = request_json( self._raw, connections_partial_update, @@ -161,8 +169,10 @@ def replace( config: dict[str, Any] | None = None, auth_config: dict[str, Any] | None = None, dynamic_inputs: dict[str, str] | None = None, + lifecycle: str | None = None, + confirm_in_use: bool | None = None, ) -> Connection: - """Replace a connection.""" + """Replace a connection. Changing settings agents already use needs confirm_in_use.""" body: dict[str, Any] = {} if name is not None: body["name"] = name @@ -174,6 +184,10 @@ def replace( body["auth_config"] = auth_config if dynamic_inputs is not None: body["dynamic_inputs"] = dynamic_inputs + if lifecycle is not None: + body["lifecycle"] = lifecycle + if confirm_in_use is not None: + body["confirm_in_use"] = confirm_in_use resp = request_json( self._raw, connections_update, @@ -187,7 +201,7 @@ def delete( self, connection_id: str, ) -> None: - """Delete a connection.""" + """Delete a connection. Refused while agents or webhooks use it.""" request_raw( self._raw, connections_destroy, diff --git a/uv.lock b/uv.lock index 58845db..2fd7fe2 100644 --- a/uv.lock +++ b/uv.lock @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "roe-ai" -version = "1.1.21" +version = "1.1.22" source = { editable = "." } dependencies = [ { name = "attrs" },