airbyte-agent-zendesk-support 0.18.48__tar.gz → 0.18.49__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 (60) hide show
  1. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/CHANGELOG.md +5 -0
  2. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/PKG-INFO +3 -3
  3. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/README.md +2 -2
  4. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +101 -20
  5. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py +11 -6
  6. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/pyproject.toml +1 -1
  7. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/.gitignore +0 -0
  8. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/REFERENCE.md +0 -0
  9. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/__init__.py +0 -0
  10. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/__init__.py +0 -0
  11. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py +0 -0
  12. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +0 -0
  13. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +0 -0
  14. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  15. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  16. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +0 -0
  17. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py +0 -0
  18. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py +0 -0
  19. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py +0 -0
  20. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  21. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py +0 -0
  22. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +0 -0
  23. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py +0 -0
  24. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  25. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  26. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py +0 -0
  27. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py +0 -0
  28. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py +0 -0
  29. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +0 -0
  30. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py +0 -0
  31. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py +0 -0
  32. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +0 -0
  33. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +0 -0
  34. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py +0 -0
  35. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py +0 -0
  36. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +0 -0
  37. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py +0 -0
  38. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +0 -0
  39. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py +0 -0
  40. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  41. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +0 -0
  42. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py +0 -0
  43. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +0 -0
  44. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +0 -0
  45. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py +0 -0
  46. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +0 -0
  47. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +0 -0
  48. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +0 -0
  49. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +0 -0
  50. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  51. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py +0 -0
  52. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +0 -0
  53. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  54. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +0 -0
  55. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py +0 -0
  56. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py +0 -0
  57. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/connector.py +0 -0
  58. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/connector_model.py +0 -0
  59. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/models.py +0 -0
  60. {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/types.py +0 -0
@@ -1,5 +1,10 @@
1
1
  # Zendesk Support changelog
2
2
 
3
+ ## [0.18.49] - 2026-01-16
4
+ - Updated connector definition (YAML version 0.1.6)
5
+ - Source commit: 49673b7b
6
+ - SDK version: 0.1.0
7
+
3
8
  ## [0.18.48] - 2026-01-16
4
9
  - Updated connector definition (YAML version 0.1.6)
5
10
  - Source commit: 05c940e3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-zendesk-support
3
- Version: 0.18.48
3
+ Version: 0.18.49
4
4
  Summary: Airbyte Zendesk-Support 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/
@@ -140,6 +140,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
140
140
 
141
141
  ## Version information
142
142
 
143
- - **Package version:** 0.18.48
143
+ - **Package version:** 0.18.49
144
144
  - **Connector version:** 0.1.6
145
- - **Generated with Connector SDK commit SHA:** 05c940e318ec945d474b4d7de78273000604608c
145
+ - **Generated with Connector SDK commit SHA:** 49673b7bd7003c15994897987408c7722319c739
@@ -107,6 +107,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
107
107
 
108
108
  ## Version information
109
109
 
110
- - **Package version:** 0.18.48
110
+ - **Package version:** 0.18.49
111
111
  - **Connector version:** 0.1.6
112
- - **Generated with Connector SDK commit SHA:** 05c940e318ec945d474b4d7de78273000604608c
112
+ - **Generated with Connector SDK commit SHA:** 49673b7bd7003c15994897987408c7722319c739
@@ -1222,15 +1222,22 @@ class LocalExecutor:
1222
1222
  def _extract_metadata(
1223
1223
  self,
1224
1224
  response_data: dict[str, Any],
1225
+ response_headers: dict[str, str],
1225
1226
  endpoint: EndpointDefinition,
1226
1227
  ) -> dict[str, Any] | None:
1227
1228
  """Extract metadata from response using meta extractor.
1228
1229
 
1229
- Each field in meta_extractor dict is independently extracted using JSONPath.
1230
+ Each field in meta_extractor dict is independently extracted using JSONPath
1231
+ for body extraction, or special prefixes for header extraction:
1232
+ - @link.{rel}: Extract URL from RFC 5988 Link header by rel type
1233
+ - @header.{name}: Extract raw header value by header name
1234
+ - Otherwise: JSONPath expression for body extraction
1235
+
1230
1236
  Missing or invalid paths result in None for that field (no crash).
1231
1237
 
1232
1238
  Args:
1233
1239
  response_data: Full API response (before record extraction)
1240
+ response_headers: HTTP response headers
1234
1241
  endpoint: Endpoint with optional meta extractor configuration
1235
1242
 
1236
1243
  Returns:
@@ -1241,11 +1248,15 @@ class LocalExecutor:
1241
1248
  Example:
1242
1249
  meta_extractor = {
1243
1250
  "pagination": "$.records",
1244
- "request_id": "$.requestId"
1251
+ "request_id": "$.requestId",
1252
+ "next_page_url": "@link.next",
1253
+ "rate_limit": "@header.X-RateLimit-Remaining"
1245
1254
  }
1246
1255
  Returns: {
1247
1256
  "pagination": {"cursor": "abc", "total": 100},
1248
- "request_id": "xyz123"
1257
+ "request_id": "xyz123",
1258
+ "next_page_url": "https://api.example.com/data?cursor=abc",
1259
+ "rate_limit": "99"
1249
1260
  }
1250
1261
  """
1251
1262
  # Check if endpoint has meta extractor
@@ -1255,26 +1266,96 @@ class LocalExecutor:
1255
1266
  extracted_meta: dict[str, Any] = {}
1256
1267
 
1257
1268
  # Extract each field independently
1258
- for field_name, jsonpath_expr_str in endpoint.meta_extractor.items():
1269
+ for field_name, extractor_expr in endpoint.meta_extractor.items():
1259
1270
  try:
1260
- # Parse and apply JSONPath expression
1261
- jsonpath_expr = parse_jsonpath(jsonpath_expr_str)
1262
- matches = [match.value for match in jsonpath_expr.find(response_data)]
1263
-
1264
- if matches:
1265
- # Return first match (most common case)
1266
- extracted_meta[field_name] = matches[0]
1271
+ if extractor_expr.startswith("@link."):
1272
+ # RFC 5988 Link header extraction
1273
+ rel = extractor_expr[6:]
1274
+ extracted_meta[field_name] = self._extract_link_url(response_headers, rel)
1275
+ elif extractor_expr.startswith("@header."):
1276
+ # Raw header value extraction (case-insensitive lookup)
1277
+ header_name = extractor_expr[8:]
1278
+ extracted_meta[field_name] = self._get_header_value(response_headers, header_name)
1267
1279
  else:
1268
- # Path not found - set to None
1269
- extracted_meta[field_name] = None
1280
+ # JSONPath body extraction
1281
+ jsonpath_expr = parse_jsonpath(extractor_expr)
1282
+ matches = [match.value for match in jsonpath_expr.find(response_data)]
1283
+
1284
+ if matches:
1285
+ # Return first match (most common case)
1286
+ extracted_meta[field_name] = matches[0]
1287
+ else:
1288
+ # Path not found - set to None
1289
+ extracted_meta[field_name] = None
1270
1290
 
1271
1291
  except Exception as e:
1272
1292
  # Log error but continue with other fields
1273
- logging.warning(f"Failed to apply meta extractor for field '{field_name}' with path '{jsonpath_expr_str}': {e}. Setting to None.")
1293
+ logging.warning(f"Failed to apply meta extractor for field '{field_name}' with expression '{extractor_expr}': {e}. Setting to None.")
1274
1294
  extracted_meta[field_name] = None
1275
1295
 
1276
1296
  return extracted_meta
1277
1297
 
1298
+ @staticmethod
1299
+ def _extract_link_url(headers: dict[str, str], rel: str) -> str | None:
1300
+ """Extract URL from RFC 5988 Link header by rel type.
1301
+
1302
+ Parses Link header format: <url>; param1="value1"; rel="next"; param2="value2"
1303
+
1304
+ Supports:
1305
+ - Multiple parameters per link in any order
1306
+ - Both quoted and unquoted rel values
1307
+ - Multiple links separated by commas
1308
+
1309
+ Args:
1310
+ headers: Response headers dict
1311
+ rel: The rel type to extract (e.g., "next", "prev", "first", "last")
1312
+
1313
+ Returns:
1314
+ The URL for the specified rel type, or None if not found
1315
+ """
1316
+ link_header = headers.get("Link") or headers.get("link", "")
1317
+ if not link_header:
1318
+ return None
1319
+
1320
+ for link_segment in re.split(r",(?=\s*<)", link_header):
1321
+ link_segment = link_segment.strip()
1322
+
1323
+ url_match = re.match(r"<([^>]+)>", link_segment)
1324
+ if not url_match:
1325
+ continue
1326
+
1327
+ url = url_match.group(1)
1328
+ params_str = link_segment[url_match.end() :]
1329
+
1330
+ rel_match = re.search(r';\s*rel="?([^";,]+)"?', params_str, re.IGNORECASE)
1331
+ if rel_match and rel_match.group(1).strip() == rel:
1332
+ return url
1333
+
1334
+ return None
1335
+
1336
+ @staticmethod
1337
+ def _get_header_value(headers: dict[str, str], header_name: str) -> str | None:
1338
+ """Get header value with case-insensitive lookup.
1339
+
1340
+ Args:
1341
+ headers: Response headers dict
1342
+ header_name: Header name to look up
1343
+
1344
+ Returns:
1345
+ Header value or None if not found
1346
+ """
1347
+ # Try exact match first
1348
+ if header_name in headers:
1349
+ return headers[header_name]
1350
+
1351
+ # Case-insensitive lookup
1352
+ header_name_lower = header_name.lower()
1353
+ for key, value in headers.items():
1354
+ if key.lower() == header_name_lower:
1355
+ return value
1356
+
1357
+ return None
1358
+
1278
1359
  def _validate_required_body_fields(self, endpoint: Any, params: dict[str, Any], action: Action, entity: str) -> None:
1279
1360
  """Validate that required body fields are present for CREATE/UPDATE operations.
1280
1361
 
@@ -1402,7 +1483,7 @@ class _StandardOperationHandler:
1402
1483
  request_kwargs = self.ctx.determine_request_format(endpoint, body)
1403
1484
 
1404
1485
  # Execute async HTTP request
1405
- response = await self.ctx.http_client.request(
1486
+ response_data, response_headers = await self.ctx.http_client.request(
1406
1487
  method=endpoint.method,
1407
1488
  path=path,
1408
1489
  params=query_params if query_params else None,
@@ -1411,10 +1492,10 @@ class _StandardOperationHandler:
1411
1492
  )
1412
1493
 
1413
1494
  # Extract metadata from original response (before record extraction)
1414
- metadata = self.ctx.executor._extract_metadata(response, endpoint)
1495
+ metadata = self.ctx.executor._extract_metadata(response_data, response_headers, endpoint)
1415
1496
 
1416
1497
  # Extract records if extractor configured
1417
- response = self.ctx.extract_records(response, endpoint)
1498
+ response = self.ctx.extract_records(response_data, endpoint)
1418
1499
 
1419
1500
  # Assume success with 200 status code if no exception raised
1420
1501
  status_code = 200
@@ -1540,7 +1621,7 @@ class _DownloadOperationHandler:
1540
1621
  request_format = self.ctx.determine_request_format(operation, request_body)
1541
1622
  self.ctx.validate_required_body_fields(operation, params, action, entity)
1542
1623
 
1543
- metadata_response = await self.ctx.http_client.request(
1624
+ metadata_response, _ = await self.ctx.http_client.request(
1544
1625
  method=operation.method,
1545
1626
  path=path,
1546
1627
  params=query_params,
@@ -1555,7 +1636,7 @@ class _DownloadOperationHandler:
1555
1636
  )
1556
1637
 
1557
1638
  # Step 3: Stream file from extracted URL
1558
- file_response = await self.ctx.http_client.request(
1639
+ file_response, _ = await self.ctx.http_client.request(
1559
1640
  method="GET",
1560
1641
  path=file_url,
1561
1642
  headers=headers,
@@ -1563,7 +1644,7 @@ class _DownloadOperationHandler:
1563
1644
  )
1564
1645
  else:
1565
1646
  # One-step direct download: stream file directly from endpoint
1566
- file_response = await self.ctx.http_client.request(
1647
+ file_response, _ = await self.ctx.http_client.request(
1567
1648
  method=operation.method,
1568
1649
  path=path,
1569
1650
  params=query_params,
@@ -421,10 +421,14 @@ class HTTPClient:
421
421
  headers: dict[str, str] | None = None,
422
422
  *,
423
423
  stream: bool = False,
424
- ):
424
+ ) -> tuple[dict[str, Any], dict[str, str]]:
425
425
  """Execute a single HTTP request attempt (no retries).
426
426
 
427
427
  This is the core request logic, separated from retry handling.
428
+
429
+ Returns:
430
+ Tuple of (response_data, response_headers) for non-streaming requests.
431
+ For streaming requests, returns (response_object, response_headers).
428
432
  """
429
433
  # Ensure auth credentials are initialized (proactive refresh if needed)
430
434
  await self._ensure_auth_initialized()
@@ -475,7 +479,7 @@ class HTTPClient:
475
479
  status_code=status_code,
476
480
  response_body=f"<binary content, {response.headers.get('content-length', 'unknown')} bytes>",
477
481
  )
478
- return response
482
+ return response, dict(response.headers)
479
483
 
480
484
  # Parse response - handle non-JSON responses gracefully
481
485
  content_type = response.headers.get("content-type", "")
@@ -501,7 +505,7 @@ class HTTPClient:
501
505
  status_code=status_code,
502
506
  response_body=response_data,
503
507
  )
504
- return response_data
508
+ return response_data, dict(response.headers)
505
509
 
506
510
  except AuthenticationError as e:
507
511
  # Auth error (401, 403) - handle token refresh
@@ -631,7 +635,7 @@ class HTTPClient:
631
635
  *,
632
636
  stream: bool = False,
633
637
  _auth_retry_attempted: bool = False,
634
- ):
638
+ ) -> tuple[dict[str, Any], dict[str, str]]:
635
639
  """Make an async HTTP request with optional streaming and automatic retries.
636
640
 
637
641
  Args:
@@ -644,8 +648,9 @@ class HTTPClient:
644
648
  stream: If True, do not eagerly read the body (useful for downloads)
645
649
 
646
650
  Returns:
647
- - If stream=False: Parsed JSON (dict) or empty dict
648
- - If stream=True: Response object suitable for streaming
651
+ Tuple of (response_data, response_headers):
652
+ - If stream=False: (parsed JSON dict or empty dict, response headers dict)
653
+ - If stream=True: (response object suitable for streaming, response headers dict)
649
654
 
650
655
  Raises:
651
656
  HTTPStatusError: If request fails with 4xx/5xx status after all retries
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "airbyte-agent-zendesk-support"
3
- version = "0.18.48"
3
+ version = "0.18.49"
4
4
  description = "Airbyte Zendesk-Support Connector for AI platforms"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"