atlan-application-sdk-api 3.51.0__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.
Files changed (78) hide show
  1. application_sdk/__init__.py +7 -0
  2. application_sdk/_build_info.py +62 -0
  3. application_sdk/_context_errors.py +65 -0
  4. application_sdk/_install.py +130 -0
  5. application_sdk/_logging.py +171 -0
  6. application_sdk/_runtime/__init__.py +29 -0
  7. application_sdk/_runtime/offload.py +1020 -0
  8. application_sdk/_runtime/progress.py +757 -0
  9. application_sdk/clients/__init__.py +63 -0
  10. application_sdk/clients/_interface.py +58 -0
  11. application_sdk/clients/_sql_failure_classifier.py +112 -0
  12. application_sdk/clients/base.py +565 -0
  13. application_sdk/clients/http_errors.py +28 -0
  14. application_sdk/clients/models.py +49 -0
  15. application_sdk/clients/sql.py +1218 -0
  16. application_sdk/clients/sql_errors.py +192 -0
  17. application_sdk/clients/sql_typecasters.py +431 -0
  18. application_sdk/clients/ssl_utils.py +247 -0
  19. application_sdk/common/__init__.py +53 -0
  20. application_sdk/common/_generated_tree.py +321 -0
  21. application_sdk/common/_listing.py +192 -0
  22. application_sdk/common/aws_utils.py +522 -0
  23. application_sdk/common/aws_utils_errors.py +88 -0
  24. application_sdk/common/build_identity.py +120 -0
  25. application_sdk/common/concurrency.py +45 -0
  26. application_sdk/common/errors.py +99 -0
  27. application_sdk/common/filter_matching.py +261 -0
  28. application_sdk/common/logger.py +11 -0
  29. application_sdk/common/models.py +31 -0
  30. application_sdk/common/sql_filters.py +719 -0
  31. application_sdk/common/sql_filters_errors.py +17 -0
  32. application_sdk/common/task_queue.py +431 -0
  33. application_sdk/common/types.py +51 -0
  34. application_sdk/common/utils.py +87 -0
  35. application_sdk/constants.py +1120 -0
  36. application_sdk/contracts/__init__.py +158 -0
  37. application_sdk/contracts/base.py +1178 -0
  38. application_sdk/contracts/events.py +251 -0
  39. application_sdk/contracts/types.py +801 -0
  40. application_sdk/contracts/types_errors.py +17 -0
  41. application_sdk/credentials/__init__.py +326 -0
  42. application_sdk/credentials/errors.py +226 -0
  43. application_sdk/credentials/extra.py +114 -0
  44. application_sdk/credentials/ingress.py +283 -0
  45. application_sdk/credentials/ref.py +376 -0
  46. application_sdk/credentials/spec.py +182 -0
  47. application_sdk/credentials/types.py +339 -0
  48. application_sdk/credentials/utils.py +257 -0
  49. application_sdk/errors/__init__.py +224 -0
  50. application_sdk/errors/base.py +504 -0
  51. application_sdk/errors/categories.py +118 -0
  52. application_sdk/errors/http.py +81 -0
  53. application_sdk/errors/leaves.py +526 -0
  54. application_sdk/errors/wire.py +124 -0
  55. application_sdk/handler/__init__.py +97 -0
  56. application_sdk/handler/_warmup.py +198 -0
  57. application_sdk/handler/asgi.py +252 -0
  58. application_sdk/handler/base.py +281 -0
  59. application_sdk/handler/context.py +212 -0
  60. application_sdk/handler/contracts.py +1166 -0
  61. application_sdk/handler/manifest.py +81 -0
  62. application_sdk/handler/metadata_routes.py +699 -0
  63. application_sdk/handler/object_routes.py +418 -0
  64. application_sdk/handler/request_contract.py +91 -0
  65. application_sdk/handler/routes.py +1118 -0
  66. application_sdk/handler/service_errors.py +37 -0
  67. application_sdk/server/__init__.py +15 -0
  68. application_sdk/server/fastapi/models.py +338 -0
  69. application_sdk/templates/__init__.py +52 -0
  70. application_sdk/templates/contracts/__init__.py +111 -0
  71. application_sdk/templates/contracts/base_metadata_extraction.py +32 -0
  72. application_sdk/templates/contracts/incremental_sql.py +563 -0
  73. application_sdk/templates/contracts/sql_metadata.py +824 -0
  74. application_sdk/templates/contracts/sql_query.py +105 -0
  75. application_sdk/version.py +40 -0
  76. atlan_application_sdk_api-3.51.0.dist-info/METADATA +230 -0
  77. atlan_application_sdk_api-3.51.0.dist-info/RECORD +78 -0
  78. atlan_application_sdk_api-3.51.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,257 @@
1
+ """Credential parsing utilities."""
2
+
3
+ import base64
4
+ import os
5
+ import warnings
6
+ from typing import Literal, overload
7
+
8
+ import orjson
9
+
10
+ from application_sdk._context_errors import ObjectStoreNotConfiguredError
11
+ from application_sdk._install import worker_only_missing
12
+ from application_sdk._logging import get_logger
13
+ from application_sdk.common.utils import download_file_from_upload_response
14
+ from application_sdk.constants import DEPLOYMENT_OBJECT_STORE_NAME, TEMPORARY_PATH
15
+ from application_sdk.credentials.extra import ( # noqa: F401 — re-exported; ships in the api distribution
16
+ parse_credentials_extra,
17
+ )
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ #: Prefix on credential field values that indicates the referenced file lives
22
+ #: in the customer's DEPLOYMENT Dapr object store binding (configured during
23
+ #: SDR setup). Intended for **non-secret companion files** that just happen
24
+ #: to be bundled into the same credential payload — see ``resolve_credential_file``.
25
+ OBJECT_STORE_PREFIX = "objectstore://"
26
+
27
+
28
+ _DEFAULT_CREDENTIAL_FILE_DIR = os.path.join(TEMPORARY_PATH, "credential_files")
29
+
30
+
31
+ @overload
32
+ async def resolve_credential_file(
33
+ value: str | None,
34
+ filename: str,
35
+ dest_dir: str = ...,
36
+ *,
37
+ raise_on_error: Literal[True],
38
+ ) -> str: ...
39
+
40
+
41
+ @overload
42
+ async def resolve_credential_file(
43
+ value: str | None,
44
+ filename: str,
45
+ dest_dir: str = ...,
46
+ *,
47
+ raise_on_error: bool | None = ...,
48
+ ) -> str | None: ...
49
+
50
+
51
+ async def resolve_credential_file(
52
+ value: str | None,
53
+ filename: str,
54
+ dest_dir: str = _DEFAULT_CREDENTIAL_FILE_DIR,
55
+ *,
56
+ raise_on_error: bool | None = None,
57
+ ) -> str | None:
58
+ """Resolve a credential-payload file field to a local file path.
59
+
60
+ A "credential payload" in Atlan can carry both true secrets (passwords,
61
+ keytabs, private keys) and non-secret companion files (krb5.conf, public
62
+ CA certificates, kerberos realm configuration) that the connector also
63
+ needs at runtime. This helper picks the right delivery mechanism for each
64
+ file based on the format of ``value``.
65
+
66
+ Three input formats are accepted, in priority order:
67
+
68
+ 1. **Atlan object-store reference** (file uploaded via the UI file picker):
69
+ ``{"key": "workflow_file_upload/...", "rawName": "...", "extension": "..."}``
70
+ The file was uploaded through the Atlan UI to Atlan's Dapr-backed
71
+ upload object store. Used for both secrets (small keytabs) and
72
+ non-secret companion files when the customer is happy to push the
73
+ file through Atlan's hosted upload pipe.
74
+
75
+ 2. **Customer object-store path** (``objectstore://<key>``):
76
+ e.g. ``"objectstore://kerberos/krb5.conf"``. The file already lives
77
+ in the customer's own bucket — the same one wired up as their
78
+ ``DEPLOYMENT_OBJECT_STORE_NAME`` Dapr binding during SDR setup. The
79
+ SDK streams it down via that existing binding at activity runtime.
80
+
81
+ This branch is intended for **non-secret companion files** that
82
+ ride alongside a true credential — e.g. a Kerberos krb5.conf or a
83
+ publicly-signed CA certificate. These files don't need
84
+ secret-manager-grade controls, but they also don't need to be
85
+ transferred through Atlan's infrastructure when the customer
86
+ already has a perfectly good object store in their environment.
87
+
88
+ Concrete benefits: no file-size ceiling (obstore streams chunks to
89
+ disk), no new credentials to manage (binding auth is already
90
+ configured), and the file content never traverses Atlan — only the
91
+ path string does.
92
+
93
+ **Not** intended for true secrets. Anything sensitive (passwords,
94
+ keytabs, private keys) belongs in the secret-store branch (#3
95
+ below) so it benefits from secret-manager controls (audit, rotation,
96
+ break-glass). Use this branch only for the non-secret companion
97
+ files that ship alongside a credential.
98
+
99
+ 3. **Base64-encoded file content** (raw string, no prefix):
100
+ ``"BQIAAAABAAoASElWRS5MT0NBTA..."``. Used for **true secrets** — the
101
+ customer base64-encodes the file, stores it as a value in their
102
+ secret manager (AWS Secrets Manager / Azure Key Vault / GCP Secret
103
+ Manager / K8s Secret), and the credential vault resolves the
104
+ reference via ``SecretStore.get_credentials()`` + Dapr at activity
105
+ runtime. The SDK sees the resolved base64 content here and decodes
106
+ it to disk. Bounded by the customer secret manager's value-size cap
107
+ (typically 1–64 KB depending on provider).
108
+
109
+ Args:
110
+ value: Raw credential field value — JSON object-store reference,
111
+ an ``objectstore://`` prefixed key, or a raw base64-encoded
112
+ string. Empty or whitespace-only means the field was
113
+ not supplied.
114
+ filename: Destination filename used for the base64 and ``objectstore://``
115
+ branches (e.g. ``"keytab.keytab"``, ``"krb5.conf"``,
116
+ ``"ca_cert.pem"``). Ignored for the Atlan upload branch —
117
+ the filename there is derived from the upload key.
118
+ dest_dir: Directory to write or download the file into. Defaults to
119
+ ``<TEMPORARY_PATH>/credential_files``.
120
+
121
+ raise_on_error: ``True`` to raise on failure, ``False`` to return
122
+ ``None``. ``None`` (the default) behaves as ``False`` and
123
+ emits a ``DeprecationWarning``; the default flips to
124
+ ``True`` in v4.0. A ``None`` for "resolution failed" is
125
+ indistinguishable from "no file configured", which is how
126
+ a failed CA-cert download became a connection with no
127
+ truststore.
128
+
129
+ Returns:
130
+ Absolute path to the resolved file on disk. ``None`` if ``value`` is
131
+ empty or resolution fails, unless ``raise_on_error`` is ``True``.
132
+
133
+ Raises:
134
+ CredentialNotFoundError: ``raise_on_error`` and ``value`` is empty or
135
+ whitespace only.
136
+ CredentialParseError: ``raise_on_error`` and ``value`` is an invalid
137
+ ``objectstore://`` key or not valid base64.
138
+ Exception: Failures downloading an Atlan upload reference propagate
139
+ in either mode, as they always have; with ``raise_on_error``,
140
+ failures downloading from the customer object store or writing
141
+ the file propagate too, with their own types.
142
+ """
143
+ if raise_on_error is None:
144
+ warnings.warn(
145
+ "resolve_credential_file() without raise_on_error is deprecated: "
146
+ "it returns None for a failed resolution as well as an empty "
147
+ "value. Pass raise_on_error=True for a typed error, or "
148
+ "raise_on_error=False to keep None — the default flips to True "
149
+ "in v4.0.",
150
+ DeprecationWarning,
151
+ stacklevel=2,
152
+ )
153
+
154
+ if not value or not value.strip():
155
+ if raise_on_error:
156
+ from application_sdk.credentials.errors import ( # noqa: PLC0415 — circular: credentials/__init__.py loads sibling modules
157
+ CredentialNotFoundError,
158
+ )
159
+
160
+ raise CredentialNotFoundError(filename)
161
+ return None
162
+
163
+ # 1. Atlan upload object store — JSON reference from the UI file picker.
164
+ # Download failures here have always propagated, in both modes.
165
+ if _is_upload_reference(value):
166
+ return await download_file_from_upload_response(value)
167
+
168
+ try:
169
+ return await _resolve_credential_file_content(value.strip(), filename, dest_dir)
170
+ # conformance: ignore[E004] re-raised unchanged under raise_on_error; otherwise the legacy None contract, logged with the cause
171
+ except Exception:
172
+ if raise_on_error:
173
+ raise
174
+ logger.error(
175
+ "Failed to resolve credential file: filename=%s", filename, exc_info=True
176
+ )
177
+ return None
178
+
179
+
180
+ def _is_upload_reference(value: str) -> bool:
181
+ """Whether *value* is an Atlan upload-store reference (JSON with a file key)."""
182
+ try:
183
+ parsed = orjson.loads(value)
184
+ # conformance: ignore[E002] value isn't a JSON file-reference; the caller falls through to the objectstore:// check
185
+ except (orjson.JSONDecodeError, TypeError):
186
+ return False
187
+ return isinstance(parsed, dict) and ("key" in parsed or "fileKey" in parsed)
188
+
189
+
190
+ async def _resolve_credential_file_content(
191
+ stripped: str, filename: str, dest_dir: str
192
+ ) -> str:
193
+ """Resolve an ``objectstore://`` key or base64 content to a local path.
194
+
195
+ Raises:
196
+ CredentialParseError: An invalid ``objectstore://`` key, or content
197
+ that is not valid base64.
198
+ """
199
+ from application_sdk.credentials.errors import ( # noqa: PLC0415 — circular: credentials/__init__.py loads sibling modules
200
+ CredentialParseError,
201
+ )
202
+
203
+ # 2. Customer's DEPLOYMENT object store — explicit objectstore:// prefix.
204
+ # Intended for non-secret companion files (krb5.conf, public CA certs)
205
+ # bundled with the credential. See resolve_credential_file's docstring.
206
+ if stripped.startswith(OBJECT_STORE_PREFIX):
207
+ key = stripped[len(OBJECT_STORE_PREFIX) :]
208
+ # Reject empty keys, absolute paths, and path-traversal segments
209
+ if not key or key.startswith("/") or ".." in key.split("/"):
210
+ raise CredentialParseError(
211
+ "Invalid object store key for credential file (empty, "
212
+ "absolute, or contains '..')",
213
+ credential_name=filename,
214
+ )
215
+ os.makedirs(dest_dir, exist_ok=True)
216
+ file_path = os.path.join(dest_dir, filename)
217
+ try:
218
+ from application_sdk.storage.binding import ( # noqa: PLC0415 — lazy: storage imports obstore (heavy Rust ext) at module load, and this module sits on the workflow-sandbox import chain (credentials package init); pinned by the preflight gate's import-hygiene test
219
+ create_store_from_binding,
220
+ )
221
+ from application_sdk.storage.ops import ( # noqa: PLC0415 — lazy: same reason as the binding import above
222
+ download_file,
223
+ )
224
+ except ModuleNotFoundError as exc:
225
+ if not worker_only_missing(exc):
226
+ raise
227
+ # api-only install (the API host): no object store to resolve from.
228
+ raise ObjectStoreNotConfiguredError() from exc
229
+
230
+ store = create_store_from_binding(DEPLOYMENT_OBJECT_STORE_NAME)
231
+ await download_file(key, file_path, store=store)
232
+ logger.info(
233
+ "Resolved credential file from customer object store: key=%s path=%s",
234
+ key,
235
+ file_path,
236
+ )
237
+ return file_path
238
+
239
+ # 3. Base64-encoded file content — decode and write to disk
240
+ try:
241
+ decoded_bytes = base64.b64decode(stripped, validate=True)
242
+ except ValueError as exc:
243
+ raise CredentialParseError(
244
+ "Credential file content is not valid base64",
245
+ credential_name=filename,
246
+ cause=exc,
247
+ ) from exc
248
+ os.makedirs(dest_dir, exist_ok=True)
249
+ file_path = os.path.join(dest_dir, filename)
250
+ with open(file_path, "wb") as f:
251
+ f.write(decoded_bytes)
252
+ logger.info(
253
+ "Resolved credential file from base64 content: path=%s filename=%s",
254
+ file_path,
255
+ filename,
256
+ )
257
+ return file_path
@@ -0,0 +1,224 @@
1
+ """Structured error codes and error hierarchy for Application SDK.
2
+
3
+ Canonical API (v3.x+)::
4
+
5
+ from application_sdk.errors import (
6
+ AppError,
7
+ FailureCategory,
8
+ Audience,
9
+ FailureDetails,
10
+ AuthError,
11
+ AppPermissionDeniedError, AppTimeoutError,
12
+ NotFoundError, AlreadyExistsError,
13
+ InvalidInputError, PreconditionError,
14
+ RateLimitedError, UnimplementedError,
15
+ DependencyUnavailableError, SourceUnavailableError,
16
+ ObjectStoreReadError, ObjectStoreDownloadError,
17
+ ResourceExhaustedError, DiskFullError,
18
+ DataIntegrityError, CancelledError, InternalError,
19
+ classify_http_status, classify_http_exception,
20
+ )
21
+
22
+ Legacy constants (v3.x — deprecated, removed in v4.0)::
23
+
24
+ from application_sdk.errors import ErrorCode, APP_ERROR, CREDENTIAL_NOT_FOUND, ...
25
+ """
26
+
27
+ from dataclasses import dataclass
28
+
29
+ # ── New canonical hierarchy ──────────────────────────────────────────────────
30
+ from application_sdk.errors.base import (
31
+ AppError,
32
+ redact_secrets,
33
+ redact_wire_value,
34
+ safe_traceback,
35
+ sanitize_cause_repr,
36
+ )
37
+ from application_sdk.errors.categories import Audience, FailureCategory
38
+ from application_sdk.errors.http import classify_http_exception, classify_http_status
39
+ from application_sdk.errors.leaves import (
40
+ WORKER_EVICTED_TYPE,
41
+ AlreadyExistsError,
42
+ AppPermissionDeniedError,
43
+ AppTimeoutError,
44
+ AuthError,
45
+ CancelledError,
46
+ ColdStartRaceError,
47
+ DaprSidecarUnreachableError,
48
+ DataIntegrityError,
49
+ DependencyUnavailableError,
50
+ DiskFullError,
51
+ InternalError,
52
+ InvalidInputError,
53
+ InvalidInputValueError,
54
+ LocalVolumeUnwritableError,
55
+ NotFoundError,
56
+ ObjectStoreDownloadError,
57
+ ObjectStoreReadError,
58
+ PreconditionError,
59
+ RateLimitedError,
60
+ ResourceExhaustedError,
61
+ SourceUnavailableError,
62
+ SourceWarmupExhaustedError,
63
+ TaskStalledError,
64
+ UnimplementedError,
65
+ )
66
+ from application_sdk.errors.wire import FailureDetails
67
+
68
+ # ── Legacy ErrorCode dataclass + AAF-* constants (deprecated — removed v4.0) ─
69
+
70
+
71
+ @dataclass(frozen=True)
72
+ class ErrorCode:
73
+ """Structured error code for monitoring and alerting.
74
+
75
+ Deprecated: use ``FailureCategory`` + typed ``AppError`` subclasses.
76
+ Will be removed in v4.0.
77
+ """
78
+
79
+ component: str
80
+ id: int
81
+
82
+ @property
83
+ def code(self) -> str:
84
+ """Format as AAF-{COMP}-{ID:03d}."""
85
+ return f"AAF-{self.component}-{self.id:03d}"
86
+
87
+ def __str__(self) -> str:
88
+ return self.code
89
+
90
+
91
+ # APP - Core App errors
92
+ APP_ERROR = ErrorCode("APP", 1)
93
+ APP_NON_RETRYABLE = ErrorCode("APP", 2)
94
+ APP_CONTEXT_ERROR = ErrorCode("APP", 3)
95
+ APP_NOT_FOUND = ErrorCode("APP", 4)
96
+ APP_ALREADY_REGISTERED = ErrorCode("APP", 5)
97
+ TASK_NOT_FOUND = ErrorCode("APP", 6)
98
+
99
+ # STR - Storage errors
100
+ STORAGE_NOT_FOUND = ErrorCode("STR", 1)
101
+ STORAGE_PERMISSION = ErrorCode("STR", 2)
102
+ STORAGE_CONFIG = ErrorCode("STR", 3)
103
+ STORAGE_OPERATION = ErrorCode("STR", 4)
104
+ STORAGE_EMPTY_UPLOAD = ErrorCode("STR", 5)
105
+ STORAGE_PREFLIGHT = ErrorCode("STR", 6)
106
+ STORAGE_INTEGRITY = ErrorCode("STR", 7)
107
+ STORAGE_RELOCATION = ErrorCode("STR", 8)
108
+ STORAGE_HANDOFF_INCOMPLETE = ErrorCode("STR", 9)
109
+ STORAGE_GATEWAY_AUTH = ErrorCode("STR", 10)
110
+ STORAGE_DISK_FULL = ErrorCode("STR", 11)
111
+ STORAGE_GATEWAY_NO_ROUTE = ErrorCode("STR", 12)
112
+
113
+ # CTR - Contract errors
114
+ CONTRACT_VALIDATION = ErrorCode("CTR", 1)
115
+ PAYLOAD_SAFETY = ErrorCode("CTR", 2)
116
+
117
+ # HDL - Handler errors
118
+ HANDLER_ERROR = ErrorCode("HDL", 1)
119
+
120
+ # EXE - Execution errors
121
+ EXECUTION_ERROR = ErrorCode("EXE", 1)
122
+ EXECUTION_WORKER_ERROR = ErrorCode("EXE", 2)
123
+ EXECUTION_ACTIVITY_ERROR = ErrorCode("EXE", 3)
124
+
125
+ # INF - Infrastructure errors
126
+ STATE_STORE_ERROR = ErrorCode("INF", 1)
127
+ PUBSUB_ERROR = ErrorCode("INF", 2)
128
+ BINDING_ERROR = ErrorCode("INF", 3)
129
+ SECRET_STORE_ERROR = ErrorCode("INF", 4)
130
+ SECRET_NOT_FOUND = ErrorCode("INF", 5)
131
+
132
+ # CRD - Credential errors
133
+ CREDENTIAL_ERROR = ErrorCode("CRD", 1)
134
+ CREDENTIAL_NOT_FOUND = ErrorCode("CRD", 2)
135
+ CREDENTIAL_PARSE_ERROR = ErrorCode("CRD", 3)
136
+ CREDENTIAL_VALIDATION_ERROR = ErrorCode("CRD", 4)
137
+ CREDENTIAL_VAULT_ERROR = ErrorCode("CRD", 5)
138
+
139
+ # DSC - Discovery errors
140
+ DISCOVERY_ERROR = ErrorCode("DSC", 1)
141
+
142
+ # EVT - Event/Analytics errors
143
+ EVENT_PUBLISH = ErrorCode("EVT", 1)
144
+ EVENT_BUS = ErrorCode("EVT", 2)
145
+ SEGMENT_ERROR = ErrorCode("EVT", 3)
146
+
147
+ __all__ = [
148
+ # New canonical
149
+ "AppError",
150
+ "Audience",
151
+ "FailureCategory",
152
+ "FailureDetails",
153
+ "AlreadyExistsError",
154
+ "AppPermissionDeniedError",
155
+ "AppTimeoutError",
156
+ "AuthError",
157
+ "CancelledError",
158
+ "ColdStartRaceError",
159
+ "DaprSidecarUnreachableError",
160
+ "DataIntegrityError",
161
+ "DependencyUnavailableError",
162
+ "DiskFullError",
163
+ "LocalVolumeUnwritableError",
164
+ "SourceUnavailableError",
165
+ "SourceWarmupExhaustedError",
166
+ "InternalError",
167
+ "InvalidInputError",
168
+ "InvalidInputValueError",
169
+ "NotFoundError",
170
+ "ObjectStoreDownloadError",
171
+ "ObjectStoreReadError",
172
+ "PreconditionError",
173
+ "RateLimitedError",
174
+ "ResourceExhaustedError",
175
+ "TaskStalledError",
176
+ "UnimplementedError",
177
+ "WORKER_EVICTED_TYPE",
178
+ "classify_http_exception",
179
+ "classify_http_status",
180
+ # Legacy (deprecated — removed in v4.0)
181
+ "ErrorCode",
182
+ "APP_ERROR",
183
+ "APP_NON_RETRYABLE",
184
+ "APP_CONTEXT_ERROR",
185
+ "APP_NOT_FOUND",
186
+ "APP_ALREADY_REGISTERED",
187
+ "TASK_NOT_FOUND",
188
+ "STORAGE_NOT_FOUND",
189
+ "STORAGE_PERMISSION",
190
+ "STORAGE_CONFIG",
191
+ "STORAGE_OPERATION",
192
+ "STORAGE_EMPTY_UPLOAD",
193
+ "STORAGE_PREFLIGHT",
194
+ "STORAGE_RELOCATION",
195
+ "STORAGE_INTEGRITY",
196
+ "STORAGE_HANDOFF_INCOMPLETE",
197
+ "STORAGE_GATEWAY_AUTH",
198
+ "STORAGE_DISK_FULL",
199
+ "STORAGE_GATEWAY_NO_ROUTE",
200
+ "CONTRACT_VALIDATION",
201
+ "PAYLOAD_SAFETY",
202
+ "HANDLER_ERROR",
203
+ "EXECUTION_ERROR",
204
+ "EXECUTION_WORKER_ERROR",
205
+ "EXECUTION_ACTIVITY_ERROR",
206
+ "STATE_STORE_ERROR",
207
+ "PUBSUB_ERROR",
208
+ "BINDING_ERROR",
209
+ "SECRET_STORE_ERROR",
210
+ "SECRET_NOT_FOUND",
211
+ "CREDENTIAL_ERROR",
212
+ "CREDENTIAL_NOT_FOUND",
213
+ "CREDENTIAL_PARSE_ERROR",
214
+ "CREDENTIAL_VALIDATION_ERROR",
215
+ "CREDENTIAL_VAULT_ERROR",
216
+ "DISCOVERY_ERROR",
217
+ "EVENT_PUBLISH",
218
+ "EVENT_BUS",
219
+ "SEGMENT_ERROR",
220
+ "redact_secrets",
221
+ "redact_wire_value",
222
+ "safe_traceback",
223
+ "sanitize_cause_repr",
224
+ ]