airbyte-cdk 6.48.9__py3-none-any.whl → 6.48.10.post2.dev14940134658__py3-none-any.whl

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.
@@ -43,6 +43,7 @@ from click import style
43
43
  from rich.console import Console
44
44
  from rich.table import Table
45
45
 
46
+ from airbyte_cdk.cli.airbyte_cdk.exceptions import ConnectorSecretWithNoValidVersionsError
46
47
  from airbyte_cdk.utils.connector_paths import (
47
48
  resolve_connector_name,
48
49
  resolve_connector_name_and_directory,
@@ -131,24 +132,46 @@ def fetch(
131
132
  )
132
133
  # Fetch and write secrets
133
134
  secret_count = 0
135
+ exceptions = []
136
+
134
137
  for secret in secrets:
135
138
  secret_file_path = _get_secret_filepath(
136
139
  secrets_dir=secrets_dir,
137
140
  secret=secret,
138
141
  )
139
- _write_secret_file(
140
- secret=secret,
141
- client=client,
142
- file_path=secret_file_path,
142
+ try:
143
+ _write_secret_file(
144
+ secret=secret,
145
+ client=client,
146
+ file_path=secret_file_path,
147
+ connector_name=connector_name,
148
+ gcp_project_id=gcp_project_id,
149
+ )
150
+ click.echo(f"Secret written to: {secret_file_path.absolute()!s}", err=True)
151
+ secret_count += 1
152
+ except ConnectorSecretWithNoValidVersionsError as e:
153
+ exceptions.append(e)
154
+ click.echo(
155
+ f"Failed to retrieve secret '{e.secret_name}': No enabled version found", err=True
156
+ )
157
+
158
+ if secret_count == 0 and not exceptions:
159
+ click.echo(
160
+ f"No secrets found for connector: '{connector_name}'",
161
+ err=True,
143
162
  )
144
- click.echo(f"Secret written to: {secret_file_path.absolute()!s}", err=True)
145
- secret_count += 1
146
163
 
147
- if secret_count == 0:
164
+ if exceptions:
165
+ error_message = f"Failed to retrieve {len(exceptions)} secret(s)"
148
166
  click.echo(
149
- f"No secrets found for connector: '{connector_name}'",
167
+ style(
168
+ error_message,
169
+ fg="red",
170
+ ),
150
171
  err=True,
151
172
  )
173
+ if secret_count == 0:
174
+ raise exceptions[0]
152
175
 
153
176
  if not print_ci_secrets_masks:
154
177
  return
@@ -230,9 +253,8 @@ def list_(
230
253
  table.add_column("Created", justify="left", style="blue", overflow="fold")
231
254
  for secret in secrets:
232
255
  full_secret_name = secret.name
233
- secret_name = full_secret_name.split("/secrets/")[-1] # Removes project prefix
234
- # E.g. https://console.cloud.google.com/security/secret-manager/secret/SECRET_SOURCE-SHOPIFY__CREDS/versions?hl=en&project=<gcp_project_id>
235
- secret_url = f"https://console.cloud.google.com/security/secret-manager/secret/{secret_name}/versions?hl=en&project={gcp_project_id}"
256
+ secret_name = _extract_secret_name(full_secret_name)
257
+ secret_url = _get_secret_url(secret_name, gcp_project_id)
236
258
  table.add_row(
237
259
  f"[link={secret_url}]{secret_name}[/link]",
238
260
  "\n".join([f"{k}={v}" for k, v in secret.labels.items()]),
@@ -242,6 +264,43 @@ def list_(
242
264
  console.print(table)
243
265
 
244
266
 
267
+ def _extract_secret_name(secret_name: str) -> str:
268
+ """Extract the secret name from a fully qualified secret path.
269
+
270
+ Handles different formats of secret names:
271
+ - Full path: "projects/project-id/secrets/SECRET_NAME"
272
+ - Already extracted: "SECRET_NAME"
273
+
274
+ Args:
275
+ secret_name: The secret name or path
276
+
277
+ Returns:
278
+ str: The extracted secret name without project prefix
279
+ """
280
+ if "/secrets/" in secret_name:
281
+ return secret_name.split("/secrets/")[-1]
282
+ return secret_name
283
+
284
+
285
+ def _get_secret_url(secret_name: str, gcp_project_id: str) -> str:
286
+ """Generate a URL for a secret in the GCP Secret Manager console.
287
+
288
+ Note: This URL itself does not contain secrets or sensitive information.
289
+ The URL itself is only useful for valid logged-in users of the project, and it
290
+ safe to print this URL in logs.
291
+
292
+ Args:
293
+ secret_name: The name of the secret in GCP.
294
+ gcp_project_id: The GCP project ID.
295
+
296
+ Returns:
297
+ str: URL to the secret in the GCP console
298
+ """
299
+ # Ensure we have just the secret name without the project prefix
300
+ secret_name = _extract_secret_name(secret_name)
301
+ return f"https://console.cloud.google.com/security/secret-manager/secret/{secret_name}/versions?hl=en&project={gcp_project_id}"
302
+
303
+
245
304
  def _fetch_secret_handles(
246
305
  connector_name: str,
247
306
  gcp_project_id: str = AIRBYTE_INTERNAL_GCP_PROJECT,
@@ -272,9 +331,44 @@ def _write_secret_file(
272
331
  secret: "Secret", # type: ignore
273
332
  client: "secretmanager.SecretManagerServiceClient", # type: ignore
274
333
  file_path: Path,
334
+ connector_name: str,
335
+ gcp_project_id: str,
275
336
  ) -> None:
276
- version_name = f"{secret.name}/versions/latest"
277
- response = client.access_secret_version(name=version_name)
337
+ """Write the most recent enabled version of a secret to a file.
338
+
339
+ Lists all enabled versions of the secret and selects the most recent one.
340
+ Raises ConnectorSecretWithNoValidVersionsError if no enabled versions are found.
341
+
342
+ Args:
343
+ secret: The secret to write to a file
344
+ client: The Secret Manager client
345
+ file_path: The path to write the secret to
346
+ connector_name: The name of the connector
347
+ gcp_project_id: The GCP project ID
348
+
349
+ Raises:
350
+ ConnectorSecretWithNoValidVersionsError: If no enabled version is found
351
+ """
352
+ # List all enabled versions of the secret.
353
+ response = client.list_secret_versions(
354
+ request={"parent": secret.name, "filter": "state:ENABLED"}
355
+ )
356
+
357
+ # The API returns versions pre-sorted in descending order, with the
358
+ # 0th item being the latest version.
359
+ versions = list(response)
360
+
361
+ if not versions:
362
+ secret_name = _extract_secret_name(secret.name)
363
+ raise ConnectorSecretWithNoValidVersionsError(
364
+ connector_name=connector_name,
365
+ secret_name=secret_name,
366
+ gcp_project_id=gcp_project_id,
367
+ )
368
+
369
+ enabled_version = versions[0]
370
+
371
+ response = client.access_secret_version(name=enabled_version.name)
278
372
  file_path.write_text(response.payload.data.decode("UTF-8"))
279
373
  file_path.chmod(0o600) # default to owner read/write only
280
374
 
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
2
+ """Exceptions for the Airbyte CDK CLI."""
3
+
4
+ from dataclasses import dataclass
5
+
6
+
7
+ @dataclass(kw_only=True)
8
+ class ConnectorSecretWithNoValidVersionsError(Exception):
9
+ """Error when a connector secret has no valid versions."""
10
+
11
+ connector_name: str
12
+ secret_name: str
13
+ gcp_project_id: str
14
+
15
+ def __str__(self) -> str:
16
+ """Return a string representation of the exception."""
17
+ from airbyte_cdk.cli.airbyte_cdk._secrets import _get_secret_url
18
+
19
+ url = _get_secret_url(self.secret_name, self.gcp_project_id)
20
+ return (
21
+ f"No valid versions found for secret '{self.secret_name}' in connector '{self.connector_name}'. "
22
+ f"Please check the following URL for more information:\n- {url}"
23
+ )
@@ -242,6 +242,10 @@ class ConcurrentPerPartitionCursor(Cursor):
242
242
  if current_time is None:
243
243
  return
244
244
  self._last_emission_time = current_time
245
+ # Skip state emit for global cursor if parent state is empty
246
+ if self._use_global_cursor and not self._parent_state:
247
+ return
248
+
245
249
  self._connector_state_manager.update_state_for_stream(
246
250
  self._stream_name,
247
251
  self._stream_namespace,
@@ -1483,7 +1483,6 @@ class ModelToComponentFactory:
1483
1483
  )
1484
1484
  )
1485
1485
  stream_state = self.apply_stream_state_migrations(stream_state_migrations, stream_state)
1486
-
1487
1486
  # Per-partition state doesn't make sense for GroupingPartitionRouter, so force the global state
1488
1487
  use_global_cursor = isinstance(
1489
1488
  partition_router, GroupingPartitionRouter
@@ -320,14 +320,14 @@ class AsyncHttpJobRepository(AsyncJobRepository):
320
320
  return polling_response_context
321
321
 
322
322
  def _get_create_job_stream_slice(self, job: AsyncJob) -> StreamSlice:
323
- stream_slice = StreamSlice(
324
- partition={},
325
- cursor_slice={},
326
- extra_fields={
323
+ return StreamSlice(
324
+ partition=job.job_parameters().partition,
325
+ cursor_slice=job.job_parameters().cursor_slice,
326
+ extra_fields=dict(job.job_parameters().extra_fields)
327
+ | {
327
328
  "creation_response": self._get_creation_response_interpolation_context(job),
328
329
  },
329
330
  )
330
- return stream_slice
331
331
 
332
332
  def _get_download_targets(self, job: AsyncJob) -> Iterable[str]:
333
333
  if not self.download_target_requester:
@@ -11,6 +11,7 @@ from airbyte_cdk.sources.declarative.interpolation.interpolated_nested_mapping i
11
11
  )
12
12
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
13
13
  from airbyte_cdk.sources.types import Config, StreamSlice
14
+ from airbyte_cdk.utils.mapping_helpers import get_interpolation_context
14
15
 
15
16
 
16
17
  @dataclass
@@ -52,8 +53,8 @@ class InterpolatedNestedRequestInputProvider:
52
53
  :param next_page_token: The pagination token
53
54
  :return: The request inputs to set on an outgoing HTTP request
54
55
  """
55
- kwargs = {
56
- "stream_slice": stream_slice,
57
- "next_page_token": next_page_token,
58
- }
56
+ kwargs = get_interpolation_context(
57
+ stream_slice=stream_slice,
58
+ next_page_token=next_page_token,
59
+ )
59
60
  return self._interpolator.eval(self.config, **kwargs) # type: ignore # self._interpolator is always initialized with a value and will not be None
@@ -8,6 +8,7 @@ from typing import Any, Mapping, Optional, Tuple, Type, Union
8
8
  from airbyte_cdk.sources.declarative.interpolation.interpolated_mapping import InterpolatedMapping
9
9
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
10
10
  from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
11
+ from airbyte_cdk.utils.mapping_helpers import get_interpolation_context
11
12
 
12
13
 
13
14
  @dataclass
@@ -51,10 +52,10 @@ class InterpolatedRequestInputProvider:
51
52
  :param valid_value_types: A tuple of types that the interpolator should allow
52
53
  :return: The request inputs to set on an outgoing HTTP request
53
54
  """
54
- kwargs = {
55
- "stream_slice": stream_slice,
56
- "next_page_token": next_page_token,
57
- }
55
+ kwargs = get_interpolation_context(
56
+ stream_slice=stream_slice,
57
+ next_page_token=next_page_token,
58
+ )
58
59
  interpolated_value = self._interpolator.eval( # type: ignore # self._interpolator is always initialized with a value and will not be None
59
60
  self.config,
60
61
  valid_key_types=valid_key_types,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.48.9
3
+ Version: 6.48.10.post2.dev14940134658
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -4,8 +4,9 @@ airbyte_cdk/cli/airbyte_cdk/__init__.py,sha256=8IoEcbdYr7CMAh97Xut5__uHH9vV4LKUt
4
4
  airbyte_cdk/cli/airbyte_cdk/_connector.py,sha256=drKb_EXJOFX-cSeLwJB8WXE-lesOL0dx2ziWSmW3Jkg,5187
5
5
  airbyte_cdk/cli/airbyte_cdk/_image.py,sha256=AkBEZrRYXEwvhW7hPOPRWeYEZutzi2PIzjpl7_yaE8I,2890
6
6
  airbyte_cdk/cli/airbyte_cdk/_manifest.py,sha256=aFdeeWgek7oXR3YfZPxk7kBZ64Blmsr0dAXN6BVGiIA,482
7
- airbyte_cdk/cli/airbyte_cdk/_secrets.py,sha256=u8-G44SoVg19FCWjcNDT0brFUZa6g_-He58Nd-VuZHI,13991
7
+ airbyte_cdk/cli/airbyte_cdk/_secrets.py,sha256=1IqVz-csoMJoKajSX4DzoWrngswuNHBPkzzchQggAeE,17010
8
8
  airbyte_cdk/cli/airbyte_cdk/_version.py,sha256=ohZNIktLFk91sdzqFW5idaNrZAPX2dIRnz---_fcKOE,352
9
+ airbyte_cdk/cli/airbyte_cdk/exceptions.py,sha256=bsGmlWN6cXL2jCD1WYAZMqFmK1OLg2xLrcC_60KHSeA,803
9
10
  airbyte_cdk/cli/source_declarative_manifest/__init__.py,sha256=-0ST722Nj65bgRokzpzPkD1NBBW5CytEHFUe38cB86Q,91
10
11
  airbyte_cdk/cli/source_declarative_manifest/_run.py,sha256=9qtbjt-I_stGWzWX6yVUKO_eE-Ga7g-uTuibML9qLBs,8330
11
12
  airbyte_cdk/cli/source_declarative_manifest/spec.json,sha256=Earc1L6ngcdIr514oFQlUoOxdF4RHqtUyStSIAquXdY,554
@@ -110,7 +111,7 @@ airbyte_cdk/sources/declarative/extractors/record_selector.py,sha256=vCpwX1PVRFP
110
111
  airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py,sha256=WJyA2OYIEgFpVP5Y3o0tIj69AV6IKkn9B16MeXaEItI,6513
111
112
  airbyte_cdk/sources/declarative/extractors/type_transformer.py,sha256=d6Y2Rfg8pMVEEnHllfVksWZdNVOU55yk34O03dP9muY,1626
112
113
  airbyte_cdk/sources/declarative/incremental/__init__.py,sha256=U1oZKtBaEC6IACmvziY9Wzg7Z8EgF4ZuR7NwvjlB_Sk,1255
113
- airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha256=4OSvZWRhKNORXJUchlvXKsWMbZKSC20AKDzt1hQnDz8,22602
114
+ airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha256=NLxDA4WOkvRhF3RwpmJ31Y0IX0b1sqGm8m7KU6qSJeo,22766
114
115
  airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=Rbe6lJLTtZ5en33MwZiB9-H9-AwDMNHgwBZs8EqhYqk,22172
115
116
  airbyte_cdk/sources/declarative/incremental/declarative_cursor.py,sha256=5Bhw9VRPyIuCaD0wmmq_L3DZsa-rJgtKSEUzSd8YYD0,536
116
117
  airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py,sha256=2tsE6FgXzemf4fZZ4uGtd8QpRBl9GJ2CRqSNJE5p0EI,16077
@@ -139,7 +140,7 @@ airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=wnRUP0Xeru9R
139
140
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=RUyFZS0zslLb7UfQrvqMC--k5CVLNSp7zHw6kbosvKE,9688
140
141
  airbyte_cdk/sources/declarative/parsers/manifest_normalizer.py,sha256=laBy7ebjA-PiNwc-50U4FHvMqS_mmHvnabxgFs4CjGw,17069
141
142
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJmg78vqE5VfUrF_KJnWjucQ4k9IWFULeAxHCowrHXE,6806
142
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=88ko64Gdfipyg9Uegz-XVCErWms0x5nHNZHCO7CRhVA,167112
143
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=Ma5Pfv1owMEbh58UA2GREmxp5e48zcU9ig_7K6Iw8uE,167111
143
144
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
144
145
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
145
146
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -163,7 +164,7 @@ airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.
163
164
  airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py,sha256=q0YkeYUUWO6iErUy0vjqiOkhg8_9d5YcCmtlpXAJJ9E,1314
164
165
  airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py,sha256=Tan66odx8VHzfdyyXMQkXz2pJYksllGqvxmpoajgcK4,669
165
166
  airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py,sha256=E-fQbt4ShfxZVoqfnmOx69C6FUPWZz8BIqI3DN9Kcjs,7935
166
- airbyte_cdk/sources/declarative/requesters/http_job_repository.py,sha256=uDyLvNsJ183oh3TT-O1PDOgpGt7OD1uqpLTDWTyb9PA,14271
167
+ airbyte_cdk/sources/declarative/requesters/http_job_repository.py,sha256=pVzIDdfGs1eAZo9F6zeFYKlEmEqanhNvZLKFCHkdmNo,14348
167
168
  airbyte_cdk/sources/declarative/requesters/http_requester.py,sha256=1qUqNxJ6I_4uSkW4KYXEtygVioURIEmiaDU8GMl_Jcs,18833
168
169
  airbyte_cdk/sources/declarative/requesters/paginators/__init__.py,sha256=uArbKs9JKNCt7t9tZoeWwjDpyI1HoPp29FNW0JzvaEM,644
169
170
  airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py,sha256=SB-Af3CRb4mJwhm4EKNxzl_PK2w5QS4tqrSNNMO2IV4,12760
@@ -186,8 +187,8 @@ airbyte_cdk/sources/declarative/requesters/request_option.py,sha256=Bl0gxGWudmwT
186
187
  airbyte_cdk/sources/declarative/requesters/request_options/__init__.py,sha256=WCwpKqM4wKqy-DHJaCHbKAlFqRVOqMi9K5qonxIfi_Y,809
187
188
  airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py,sha256=31nG6_0igidJFQon37-WeQkTpG3g2A5ZmlluI3ilZdE,3632
188
189
  airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py,sha256=SRROdPJZ5kuqHLOlkh115pWP9nDGfDxRYPgH9oD3hPo,1798
189
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py,sha256=86YozYuBDfu0t9NbevIvQoGU0vqTP4rt3dRSTsHz3PA,2269
190
- airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py,sha256=rR00kE64U2yL0McU1gPr4_W5_sLUqwDgL3Nvj691nRU,2884
190
+ airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py,sha256=STVopTmEZaxmE-w_2zL6CYXFxq-2K2wDKGtWj9OYZyU,2360
191
+ airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py,sha256=-X_sncjnw3N5ZyhlLMOI6vnWy2CM8drqPFOKgzDXTQg,2975
191
192
  airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py,sha256=ks4rCSdEKTX2bm8obDf-PzWggel1rQEwtu35-rQvqVk,8274
192
193
  airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py,sha256=8YRiDzjYvqJ-aMmKFcjqzv_-e8OZ5QG_TbpZ-nuCu6s,2590
193
194
  airbyte_cdk/sources/declarative/requesters/request_path.py,sha256=S3MeFvcaQrMbOkSY2W2VbXLNomqt_3eXqVd9ZhgNwUs,299
@@ -407,9 +408,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
407
408
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
408
409
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
409
410
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
410
- airbyte_cdk-6.48.9.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
411
- airbyte_cdk-6.48.9.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
412
- airbyte_cdk-6.48.9.dist-info/METADATA,sha256=gTA6WrjXLh_UFtrwmxoS5Ci4swMfmFMrnUta4edFt9A,6343
413
- airbyte_cdk-6.48.9.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
414
- airbyte_cdk-6.48.9.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
415
- airbyte_cdk-6.48.9.dist-info/RECORD,,
411
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
412
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
413
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/METADATA,sha256=vps7yK7oGARp_Bg45xFIqSstF0XPBGGF7-HpjfIryI4,6365
414
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
415
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
416
+ airbyte_cdk-6.48.10.post2.dev14940134658.dist-info/RECORD,,