airbyte-agent-slack 0.1.20__tar.gz → 0.1.22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/AUTH.md +1 -1
  2. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/CHANGELOG.md +10 -0
  3. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/PKG-INFO +6 -6
  4. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/README.md +5 -5
  5. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/REFERENCE.md +224 -2
  6. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/__init__.py +32 -4
  7. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/connector_model_loader.py +84 -0
  8. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/executor/local_executor.py +3 -1
  9. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/introspection.py +222 -10
  10. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/components.py +5 -0
  11. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/types.py +1 -0
  12. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/connector.py +265 -32
  13. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/connector_model.py +101 -1
  14. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/models.py +181 -21
  15. airbyte_agent_slack-0.1.22/airbyte_agent_slack/types.py +883 -0
  16. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/pyproject.toml +1 -1
  17. airbyte_agent_slack-0.1.20/airbyte_agent_slack/types.py +0 -98
  18. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/.gitignore +0 -0
  19. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/__init__.py +0 -0
  20. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/__init__.py +0 -0
  21. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/auth_strategies.py +0 -0
  22. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/auth_template.py +0 -0
  23. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  24. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  25. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/constants.py +0 -0
  26. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/exceptions.py +0 -0
  27. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/executor/__init__.py +0 -0
  28. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  29. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/executor/models.py +0 -0
  30. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/extensions.py +0 -0
  31. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/__init__.py +0 -0
  32. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  33. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  34. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/config.py +0 -0
  35. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/exceptions.py +0 -0
  36. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/protocols.py +0 -0
  37. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http/response.py +0 -0
  38. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/http_client.py +0 -0
  39. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/logging/__init__.py +0 -0
  40. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/logging/logger.py +0 -0
  41. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/logging/types.py +0 -0
  42. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/observability/__init__.py +0 -0
  43. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/observability/config.py +0 -0
  44. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/observability/models.py +0 -0
  45. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/observability/redactor.py +0 -0
  46. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/observability/session.py +0 -0
  47. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/performance/__init__.py +0 -0
  48. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  49. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/performance/metrics.py +0 -0
  50. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/__init__.py +0 -0
  51. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/base.py +0 -0
  52. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/connector.py +0 -0
  53. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/extensions.py +0 -0
  54. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/operations.py +0 -0
  55. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/schema/security.py +0 -0
  56. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/secrets.py +0 -0
  57. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  58. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/telemetry/config.py +0 -0
  59. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/telemetry/events.py +0 -0
  60. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  61. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/utils.py +0 -0
  62. {airbyte_agent_slack-0.1.20 → airbyte_agent_slack-0.1.22}/airbyte_agent_slack/_vendored/connector_sdk/validation.py +0 -0
@@ -103,7 +103,7 @@ connector = SlackConnector(
103
103
  )
104
104
 
105
105
  @agent.tool_plain # assumes you're using Pydantic AI
106
- @SlackConnector.describe
106
+ @SlackConnector.tool_utils
107
107
  async def slack_execute(entity: str, action: str, params: dict | None = None):
108
108
  return await connector.execute(entity, action, params or {})
109
109
  ```
@@ -1,5 +1,15 @@
1
1
  # Slack changelog
2
2
 
3
+ ## [0.1.22] - 2026-01-24
4
+ - Updated connector definition (YAML version 0.1.8)
5
+ - Source commit: 609c1d86
6
+ - SDK version: 0.1.0
7
+
8
+ ## [0.1.21] - 2026-01-23
9
+ - Updated connector definition (YAML version 0.1.8)
10
+ - Source commit: 32c5ef46
11
+ - SDK version: 0.1.0
12
+
3
13
  ## [0.1.20] - 2026-01-23
4
14
  - Updated connector definition (YAML version 0.1.7)
5
15
  - Source commit: 049f6ad5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-slack
3
- Version: 0.1.20
3
+ Version: 0.1.22
4
4
  Summary: Airbyte Slack Connector for AI platforms
5
5
  Project-URL: Homepage, https://github.com/airbytehq/airbyte-agent-connectors
6
6
  Project-URL: Documentation, https://docs.airbyte.com/ai-agents/
@@ -104,7 +104,7 @@ connector = SlackConnector(
104
104
  )
105
105
 
106
106
  @agent.tool_plain # assumes you're using Pydantic AI
107
- @SlackConnector.describe
107
+ @SlackConnector.tool_utils
108
108
  async def slack_execute(entity: str, action: str, params: dict | None = None):
109
109
  return await connector.execute(entity, action, params or {})
110
110
  ```
@@ -125,7 +125,7 @@ connector = SlackConnector(
125
125
  )
126
126
 
127
127
  @agent.tool_plain # assumes you're using Pydantic AI
128
- @SlackConnector.describe
128
+ @SlackConnector.tool_utils
129
129
  async def slack_execute(entity: str, action: str, params: dict | None = None):
130
130
  return await connector.execute(entity, action, params or {})
131
131
  ```
@@ -158,6 +158,6 @@ For the service's official API docs, see the [Slack API reference](https://api.s
158
158
 
159
159
  ## Version information
160
160
 
161
- - **Package version:** 0.1.20
162
- - **Connector version:** 0.1.7
163
- - **Generated with Connector SDK commit SHA:** 049f6ad546186bde8303b77e0e1001a831a58654
161
+ - **Package version:** 0.1.22
162
+ - **Connector version:** 0.1.8
163
+ - **Generated with Connector SDK commit SHA:** 609c1d86c76b36ff699b57123a5a8c2050d958c3
@@ -71,7 +71,7 @@ connector = SlackConnector(
71
71
  )
72
72
 
73
73
  @agent.tool_plain # assumes you're using Pydantic AI
74
- @SlackConnector.describe
74
+ @SlackConnector.tool_utils
75
75
  async def slack_execute(entity: str, action: str, params: dict | None = None):
76
76
  return await connector.execute(entity, action, params or {})
77
77
  ```
@@ -92,7 +92,7 @@ connector = SlackConnector(
92
92
  )
93
93
 
94
94
  @agent.tool_plain # assumes you're using Pydantic AI
95
- @SlackConnector.describe
95
+ @SlackConnector.tool_utils
96
96
  async def slack_execute(entity: str, action: str, params: dict | None = None):
97
97
  return await connector.execute(entity, action, params or {})
98
98
  ```
@@ -125,6 +125,6 @@ For the service's official API docs, see the [Slack API reference](https://api.s
125
125
 
126
126
  ## Version information
127
127
 
128
- - **Package version:** 0.1.20
129
- - **Connector version:** 0.1.7
130
- - **Generated with Connector SDK commit SHA:** 049f6ad546186bde8303b77e0e1001a831a58654
128
+ - **Package version:** 0.1.22
129
+ - **Connector version:** 0.1.8
130
+ - **Generated with Connector SDK commit SHA:** 609c1d86c76b36ff699b57123a5a8c2050d958c3
@@ -8,8 +8,8 @@ The Slack connector supports the following entities and actions.
8
8
 
9
9
  | Entity | Actions |
10
10
  |--------|---------|
11
- | Users | [List](#users-list), [Get](#users-get) |
12
- | Channels | [List](#channels-list), [Get](#channels-get), [Create](#channels-create), [Update](#channels-update) |
11
+ | Users | [List](#users-list), [Get](#users-get), [Search](#users-search) |
12
+ | Channels | [List](#channels-list), [Get](#channels-get), [Create](#channels-create), [Update](#channels-update), [Search](#channels-search) |
13
13
  | Channel Messages | [List](#channel-messages-list) |
14
14
  | Threads | [List](#threads-list) |
15
15
  | Messages | [Create](#messages-create), [Update](#messages-update) |
@@ -151,6 +151,109 @@ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_i
151
151
  | `who_can_share_contact_card` | `string \| null` | |
152
152
 
153
153
 
154
+ </details>
155
+
156
+ ### Users Search
157
+
158
+ Search and filter users records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.
159
+
160
+ #### Python SDK
161
+
162
+ ```python
163
+ await slack.users.search(
164
+ query={"filter": {"eq": {"color": "<str>"}}}
165
+ )
166
+ ```
167
+
168
+ #### API
169
+
170
+ ```bash
171
+ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_id}/execute' \
172
+ --header 'Content-Type: application/json' \
173
+ --header 'Authorization: Bearer {your_auth_token}' \
174
+ --data '{
175
+ "entity": "users",
176
+ "action": "search",
177
+ "params": {
178
+ "query": {"filter": {"eq": {"color": "<str>"}}}
179
+ }
180
+ }'
181
+ ```
182
+
183
+ #### Parameters
184
+
185
+ | Parameter Name | Type | Required | Description |
186
+ |----------------|------|----------|-------------|
187
+ | `query` | `object` | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
188
+ | `query.filter` | `object` | No | Filter conditions |
189
+ | `query.sort` | `array` | No | Sort conditions |
190
+ | `limit` | `integer` | No | Maximum results to return (default 1000) |
191
+ | `cursor` | `string` | No | Pagination cursor from previous response's next_cursor |
192
+ | `fields` | `array` | No | Field paths to include in results |
193
+
194
+ #### Searchable Fields
195
+
196
+ | Field Name | Type | Description |
197
+ |------------|------|-------------|
198
+ | `color` | `string` | The color assigned to the user for visual purposes. |
199
+ | `deleted` | `boolean` | Indicates if the user is deleted or not. |
200
+ | `has_2fa` | `boolean` | Flag indicating if the user has two-factor authentication enabled. |
201
+ | `id` | `string` | Unique identifier for the user. |
202
+ | `is_admin` | `boolean` | Flag specifying if the user is an admin or not. |
203
+ | `is_app_user` | `boolean` | Specifies if the user is an app user. |
204
+ | `is_bot` | `boolean` | Indicates if the user is a bot account. |
205
+ | `is_email_confirmed` | `boolean` | Flag indicating if the user's email is confirmed. |
206
+ | `is_forgotten` | `boolean` | Specifies if the user is marked as forgotten. |
207
+ | `is_invited_user` | `boolean` | Indicates if the user is invited or not. |
208
+ | `is_owner` | `boolean` | Flag indicating if the user is an owner. |
209
+ | `is_primary_owner` | `boolean` | Specifies if the user is the primary owner. |
210
+ | `is_restricted` | `boolean` | Flag specifying if the user is restricted. |
211
+ | `is_ultra_restricted` | `boolean` | Indicates if the user has ultra-restricted access. |
212
+ | `name` | `string` | The username of the user. |
213
+ | `profile` | `object` | User's profile information containing detailed details. |
214
+ | `real_name` | `string` | The real name of the user. |
215
+ | `team_id` | `string` | Unique identifier for the team the user belongs to. |
216
+ | `tz` | `string` | Timezone of the user. |
217
+ | `tz_label` | `string` | Label representing the timezone of the user. |
218
+ | `tz_offset` | `integer` | Offset of the user's timezone. |
219
+ | `updated` | `integer` | Timestamp of when the user's information was last updated. |
220
+ | `who_can_share_contact_card` | `string` | Specifies who can share the user's contact card. |
221
+
222
+ <details>
223
+ <summary><b>Response Schema</b></summary>
224
+
225
+ | Field Name | Type | Description |
226
+ |------------|------|-------------|
227
+ | `hits` | `array` | List of matching records |
228
+ | `hits[].id` | `string` | Record identifier |
229
+ | `hits[].score` | `number` | Relevance score |
230
+ | `hits[].data` | `object` | Record data containing the searchable fields listed above |
231
+ | `hits[].data.color` | `string` | The color assigned to the user for visual purposes. |
232
+ | `hits[].data.deleted` | `boolean` | Indicates if the user is deleted or not. |
233
+ | `hits[].data.has_2fa` | `boolean` | Flag indicating if the user has two-factor authentication enabled. |
234
+ | `hits[].data.id` | `string` | Unique identifier for the user. |
235
+ | `hits[].data.is_admin` | `boolean` | Flag specifying if the user is an admin or not. |
236
+ | `hits[].data.is_app_user` | `boolean` | Specifies if the user is an app user. |
237
+ | `hits[].data.is_bot` | `boolean` | Indicates if the user is a bot account. |
238
+ | `hits[].data.is_email_confirmed` | `boolean` | Flag indicating if the user's email is confirmed. |
239
+ | `hits[].data.is_forgotten` | `boolean` | Specifies if the user is marked as forgotten. |
240
+ | `hits[].data.is_invited_user` | `boolean` | Indicates if the user is invited or not. |
241
+ | `hits[].data.is_owner` | `boolean` | Flag indicating if the user is an owner. |
242
+ | `hits[].data.is_primary_owner` | `boolean` | Specifies if the user is the primary owner. |
243
+ | `hits[].data.is_restricted` | `boolean` | Flag specifying if the user is restricted. |
244
+ | `hits[].data.is_ultra_restricted` | `boolean` | Indicates if the user has ultra-restricted access. |
245
+ | `hits[].data.name` | `string` | The username of the user. |
246
+ | `hits[].data.profile` | `object` | User's profile information containing detailed details. |
247
+ | `hits[].data.real_name` | `string` | The real name of the user. |
248
+ | `hits[].data.team_id` | `string` | Unique identifier for the team the user belongs to. |
249
+ | `hits[].data.tz` | `string` | Timezone of the user. |
250
+ | `hits[].data.tz_label` | `string` | Label representing the timezone of the user. |
251
+ | `hits[].data.tz_offset` | `integer` | Offset of the user's timezone. |
252
+ | `hits[].data.updated` | `integer` | Timestamp of when the user's information was last updated. |
253
+ | `hits[].data.who_can_share_contact_card` | `string` | Specifies who can share the user's contact card. |
254
+ | `next_cursor` | `string \| null` | Cursor for next page of results |
255
+ | `took_ms` | `number` | Query execution time in milliseconds |
256
+
154
257
  </details>
155
258
 
156
259
  ## Channels
@@ -471,6 +574,125 @@ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_i
471
574
  | `is_read_only` | `boolean \| null` | |
472
575
 
473
576
 
577
+ </details>
578
+
579
+ ### Channels Search
580
+
581
+ Search and filter channels records powered by Airbyte's data sync. This often provides additional fields and operators beyond what the API natively supports, making it easier to narrow down results before performing further operations. Only available in hosted mode.
582
+
583
+ #### Python SDK
584
+
585
+ ```python
586
+ await slack.channels.search(
587
+ query={"filter": {"eq": {"context_team_id": "<str>"}}}
588
+ )
589
+ ```
590
+
591
+ #### API
592
+
593
+ ```bash
594
+ curl --location 'https://api.airbyte.ai/api/v1/connectors/sources/{your_source_id}/execute' \
595
+ --header 'Content-Type: application/json' \
596
+ --header 'Authorization: Bearer {your_auth_token}' \
597
+ --data '{
598
+ "entity": "channels",
599
+ "action": "search",
600
+ "params": {
601
+ "query": {"filter": {"eq": {"context_team_id": "<str>"}}}
602
+ }
603
+ }'
604
+ ```
605
+
606
+ #### Parameters
607
+
608
+ | Parameter Name | Type | Required | Description |
609
+ |----------------|------|----------|-------------|
610
+ | `query` | `object` | Yes | Filter and sort conditions. Supports operators: eq, neq, gt, gte, lt, lte, in, like, fuzzy, keyword, not, and, or |
611
+ | `query.filter` | `object` | No | Filter conditions |
612
+ | `query.sort` | `array` | No | Sort conditions |
613
+ | `limit` | `integer` | No | Maximum results to return (default 1000) |
614
+ | `cursor` | `string` | No | Pagination cursor from previous response's next_cursor |
615
+ | `fields` | `array` | No | Field paths to include in results |
616
+
617
+ #### Searchable Fields
618
+
619
+ | Field Name | Type | Description |
620
+ |------------|------|-------------|
621
+ | `context_team_id` | `string` | The unique identifier of the team context in which the channel exists. |
622
+ | `created` | `integer` | The timestamp when the channel was created. |
623
+ | `creator` | `string` | The ID of the user who created the channel. |
624
+ | `id` | `string` | The unique identifier of the channel. |
625
+ | `is_archived` | `boolean` | Indicates if the channel is archived. |
626
+ | `is_channel` | `boolean` | Indicates if the entity is a channel. |
627
+ | `is_ext_shared` | `boolean` | Indicates if the channel is externally shared. |
628
+ | `is_general` | `boolean` | Indicates if the channel is a general channel in the workspace. |
629
+ | `is_group` | `boolean` | Indicates if the channel is a group (private channel) rather than a regular channel. |
630
+ | `is_im` | `boolean` | Indicates if the entity is a direct message (IM) channel. |
631
+ | `is_member` | `boolean` | Indicates if the calling user is a member of the channel. |
632
+ | `is_mpim` | `boolean` | Indicates if the entity is a multiple person direct message (MPIM) channel. |
633
+ | `is_org_shared` | `boolean` | Indicates if the channel is organization-wide shared. |
634
+ | `is_pending_ext_shared` | `boolean` | Indicates if the channel is pending external shared. |
635
+ | `is_private` | `boolean` | Indicates if the channel is a private channel. |
636
+ | `is_read_only` | `boolean` | Indicates if the channel is read-only. |
637
+ | `is_shared` | `boolean` | Indicates if the channel is shared. |
638
+ | `last_read` | `string` | The timestamp of the user's last read message in the channel. |
639
+ | `locale` | `string` | The locale of the channel. |
640
+ | `name` | `string` | The name of the channel. |
641
+ | `name_normalized` | `string` | The normalized name of the channel. |
642
+ | `num_members` | `integer` | The number of members in the channel. |
643
+ | `parent_conversation` | `string` | The parent conversation of the channel. |
644
+ | `pending_connected_team_ids` | `array` | The IDs of teams that are pending to be connected to the channel. |
645
+ | `pending_shared` | `array` | The list of pending shared items of the channel. |
646
+ | `previous_names` | `array` | The previous names of the channel. |
647
+ | `purpose` | `object` | The purpose of the channel. |
648
+ | `shared_team_ids` | `array` | The IDs of teams with which the channel is shared. |
649
+ | `topic` | `object` | The topic of the channel. |
650
+ | `unlinked` | `integer` | Indicates if the channel is unlinked. |
651
+ | `updated` | `integer` | The timestamp when the channel was last updated. |
652
+
653
+ <details>
654
+ <summary><b>Response Schema</b></summary>
655
+
656
+ | Field Name | Type | Description |
657
+ |------------|------|-------------|
658
+ | `hits` | `array` | List of matching records |
659
+ | `hits[].id` | `string` | Record identifier |
660
+ | `hits[].score` | `number` | Relevance score |
661
+ | `hits[].data` | `object` | Record data containing the searchable fields listed above |
662
+ | `hits[].data.context_team_id` | `string` | The unique identifier of the team context in which the channel exists. |
663
+ | `hits[].data.created` | `integer` | The timestamp when the channel was created. |
664
+ | `hits[].data.creator` | `string` | The ID of the user who created the channel. |
665
+ | `hits[].data.id` | `string` | The unique identifier of the channel. |
666
+ | `hits[].data.is_archived` | `boolean` | Indicates if the channel is archived. |
667
+ | `hits[].data.is_channel` | `boolean` | Indicates if the entity is a channel. |
668
+ | `hits[].data.is_ext_shared` | `boolean` | Indicates if the channel is externally shared. |
669
+ | `hits[].data.is_general` | `boolean` | Indicates if the channel is a general channel in the workspace. |
670
+ | `hits[].data.is_group` | `boolean` | Indicates if the channel is a group (private channel) rather than a regular channel. |
671
+ | `hits[].data.is_im` | `boolean` | Indicates if the entity is a direct message (IM) channel. |
672
+ | `hits[].data.is_member` | `boolean` | Indicates if the calling user is a member of the channel. |
673
+ | `hits[].data.is_mpim` | `boolean` | Indicates if the entity is a multiple person direct message (MPIM) channel. |
674
+ | `hits[].data.is_org_shared` | `boolean` | Indicates if the channel is organization-wide shared. |
675
+ | `hits[].data.is_pending_ext_shared` | `boolean` | Indicates if the channel is pending external shared. |
676
+ | `hits[].data.is_private` | `boolean` | Indicates if the channel is a private channel. |
677
+ | `hits[].data.is_read_only` | `boolean` | Indicates if the channel is read-only. |
678
+ | `hits[].data.is_shared` | `boolean` | Indicates if the channel is shared. |
679
+ | `hits[].data.last_read` | `string` | The timestamp of the user's last read message in the channel. |
680
+ | `hits[].data.locale` | `string` | The locale of the channel. |
681
+ | `hits[].data.name` | `string` | The name of the channel. |
682
+ | `hits[].data.name_normalized` | `string` | The normalized name of the channel. |
683
+ | `hits[].data.num_members` | `integer` | The number of members in the channel. |
684
+ | `hits[].data.parent_conversation` | `string` | The parent conversation of the channel. |
685
+ | `hits[].data.pending_connected_team_ids` | `array` | The IDs of teams that are pending to be connected to the channel. |
686
+ | `hits[].data.pending_shared` | `array` | The list of pending shared items of the channel. |
687
+ | `hits[].data.previous_names` | `array` | The previous names of the channel. |
688
+ | `hits[].data.purpose` | `object` | The purpose of the channel. |
689
+ | `hits[].data.shared_team_ids` | `array` | The IDs of teams with which the channel is shared. |
690
+ | `hits[].data.topic` | `object` | The topic of the channel. |
691
+ | `hits[].data.unlinked` | `integer` | Indicates if the channel is unlinked. |
692
+ | `hits[].data.updated` | `integer` | The timestamp when the channel was last updated. |
693
+ | `next_cursor` | `string \| null` | Cursor for next page of results |
694
+ | `took_ms` | `number` | Query execution time in milliseconds |
695
+
474
696
  </details>
475
697
 
476
698
  ## Channel Messages
@@ -18,8 +18,8 @@ from .models import (
18
18
  ChannelsListResponse,
19
19
  ChannelResponse,
20
20
  Reaction,
21
- Attachment,
22
21
  File,
22
+ Attachment,
23
23
  Message,
24
24
  Thread,
25
25
  EditedInfo,
@@ -50,7 +50,13 @@ from .models import (
50
50
  UsersListResult,
51
51
  ChannelsListResult,
52
52
  ChannelMessagesListResult,
53
- ThreadsListResult
53
+ ThreadsListResult,
54
+ AirbyteSearchHit,
55
+ AirbyteSearchResult,
56
+ ChannelsSearchData,
57
+ ChannelsSearchResult,
58
+ UsersSearchData,
59
+ UsersSearchResult
54
60
  )
55
61
  from .types import (
56
62
  UsersListParams,
@@ -65,7 +71,15 @@ from .types import (
65
71
  ChannelsUpdateParams,
66
72
  ChannelTopicsCreateParams,
67
73
  ChannelPurposesCreateParams,
68
- ReactionsCreateParams
74
+ ReactionsCreateParams,
75
+ AirbyteSearchParams,
76
+ AirbyteSortOrder,
77
+ ChannelsSearchFilter,
78
+ ChannelsSearchQuery,
79
+ ChannelsCondition,
80
+ UsersSearchFilter,
81
+ UsersSearchQuery,
82
+ UsersCondition
69
83
  )
70
84
 
71
85
  __all__ = [
@@ -82,8 +96,8 @@ __all__ = [
82
96
  "ChannelsListResponse",
83
97
  "ChannelResponse",
84
98
  "Reaction",
85
- "Attachment",
86
99
  "File",
100
+ "Attachment",
87
101
  "Message",
88
102
  "Thread",
89
103
  "EditedInfo",
@@ -115,6 +129,12 @@ __all__ = [
115
129
  "ChannelsListResult",
116
130
  "ChannelMessagesListResult",
117
131
  "ThreadsListResult",
132
+ "AirbyteSearchHit",
133
+ "AirbyteSearchResult",
134
+ "ChannelsSearchData",
135
+ "ChannelsSearchResult",
136
+ "UsersSearchData",
137
+ "UsersSearchResult",
118
138
  "UsersListParams",
119
139
  "UsersGetParams",
120
140
  "ChannelsListParams",
@@ -128,4 +148,12 @@ __all__ = [
128
148
  "ChannelTopicsCreateParams",
129
149
  "ChannelPurposesCreateParams",
130
150
  "ReactionsCreateParams",
151
+ "AirbyteSearchParams",
152
+ "AirbyteSortOrder",
153
+ "ChannelsSearchFilter",
154
+ "ChannelsSearchQuery",
155
+ "ChannelsCondition",
156
+ "UsersSearchFilter",
157
+ "UsersSearchQuery",
158
+ "UsersCondition",
131
159
  ]
@@ -145,6 +145,87 @@ def _deproxy_schema(obj: Any) -> Any:
145
145
  return obj
146
146
 
147
147
 
148
+ def _type_includes(type_value: Any, target: str) -> bool:
149
+ if isinstance(type_value, list):
150
+ return target in type_value
151
+ return type_value == target
152
+
153
+
154
+ def _flatten_cache_properties(properties: dict[str, Any], prefix: str) -> list[str]:
155
+ entries: list[str] = []
156
+ for prop_name, prop in properties.items():
157
+ path = f"{prefix}{prop_name}" if prefix else prop_name
158
+ entries.append(path)
159
+
160
+ prop_type = getattr(prop, "type", None) if not isinstance(prop, dict) else prop.get("type")
161
+ prop_properties = getattr(prop, "properties", None) if not isinstance(prop, dict) else prop.get("properties")
162
+
163
+ if _type_includes(prop_type, "array"):
164
+ array_path = f"{path}[]"
165
+ entries.append(array_path)
166
+ if isinstance(prop_properties, dict):
167
+ entries.extend(_flatten_cache_properties(prop_properties, prefix=f"{array_path}."))
168
+ elif isinstance(prop_properties, dict):
169
+ entries.extend(_flatten_cache_properties(prop_properties, prefix=f"{path}."))
170
+
171
+ return entries
172
+
173
+
174
+ def _flatten_cache_field_paths(field: Any) -> list[str]:
175
+ field_name = getattr(field, "name", None) if not isinstance(field, dict) else field.get("name")
176
+ if not isinstance(field_name, str) or not field_name:
177
+ return []
178
+
179
+ field_type = getattr(field, "type", None) if not isinstance(field, dict) else field.get("type")
180
+ field_properties = getattr(field, "properties", None) if not isinstance(field, dict) else field.get("properties")
181
+
182
+ entries = [field_name]
183
+ if _type_includes(field_type, "array"):
184
+ array_path = f"{field_name}[]"
185
+ entries.append(array_path)
186
+ if isinstance(field_properties, dict):
187
+ entries.extend(_flatten_cache_properties(field_properties, prefix=f"{array_path}."))
188
+ elif isinstance(field_properties, dict):
189
+ entries.extend(_flatten_cache_properties(field_properties, prefix=f"{field_name}."))
190
+
191
+ return entries
192
+
193
+
194
+ def _dedupe_strings(values: list[str]) -> list[str]:
195
+ seen: set[str] = set()
196
+ ordered: list[str] = []
197
+ for value in values:
198
+ if value not in seen:
199
+ seen.add(value)
200
+ ordered.append(value)
201
+ return ordered
202
+
203
+
204
+ def _extract_search_field_paths(spec: OpenAPIConnector) -> dict[str, list[str]]:
205
+ cache_config = getattr(spec.info, "x_airbyte_cache", None)
206
+ entities = getattr(cache_config, "entities", None)
207
+ if not isinstance(entities, list):
208
+ return {}
209
+
210
+ search_fields: dict[str, list[str]] = {}
211
+ for entity in entities:
212
+ entity_name = getattr(entity, "entity", None) if not isinstance(entity, dict) else entity.get("entity")
213
+ if not isinstance(entity_name, str) or not entity_name:
214
+ continue
215
+
216
+ fields = getattr(entity, "fields", None) if not isinstance(entity, dict) else entity.get("fields")
217
+ if not isinstance(fields, list):
218
+ continue
219
+
220
+ field_paths: list[str] = []
221
+ for field in fields:
222
+ field_paths.extend(_flatten_cache_field_paths(field))
223
+
224
+ search_fields[entity_name] = _dedupe_strings(field_paths)
225
+
226
+ return search_fields
227
+
228
+
148
229
  def parse_openapi_spec(raw_config: dict) -> OpenAPIConnector:
149
230
  """Parse OpenAPI specification from YAML.
150
231
 
@@ -434,6 +515,8 @@ def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel
434
515
  if not connector_id:
435
516
  raise InvalidOpenAPIError("Missing required x-airbyte-connector-id field")
436
517
 
518
+ search_field_paths = _extract_search_field_paths(spec)
519
+
437
520
  # Create ConnectorModel
438
521
  model = ConnectorModel(
439
522
  id=connector_id,
@@ -444,6 +527,7 @@ def convert_openapi_to_connector_model(spec: OpenAPIConnector) -> ConnectorModel
444
527
  entities=entities,
445
528
  openapi_spec=spec,
446
529
  retry_config=retry_config,
530
+ search_field_paths=search_field_paths,
447
531
  )
448
532
 
449
533
  return model
@@ -1032,7 +1032,9 @@ class LocalExecutor:
1032
1032
  if "variables" in graphql_config and graphql_config["variables"]:
1033
1033
  variables = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
1034
1034
  # Filter out None values (optional fields not provided) - matches REST _extract_body() behavior
1035
- body["variables"] = {k: v for k, v in variables.items() if v is not None}
1035
+ # But preserve None for variables explicitly marked as nullable (e.g., to unassign a user)
1036
+ nullable_vars = set(graphql_config.get("x-airbyte-nullable-variables") or [])
1037
+ body["variables"] = {k: v for k, v in variables.items() if v is not None or k in nullable_vars}
1036
1038
 
1037
1039
  # Add operation name if specified
1038
1040
  if "operationName" in graphql_config: