dominus-sdk-python 6.2.0__tar.gz → 7.0.0__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.
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/PKG-INFO +11 -2
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/README.md +10 -1
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/__init__.py +17 -1
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/errors.py +41 -1
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/__init__.py +4 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/authority.py +10 -69
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/stash.py +160 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/start.py +1 -1
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/PKG-INFO +11 -2
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/SOURCES.txt +2 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/pyproject.toml +1 -1
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_authority_public_vocabulary.py +28 -56
- dominus_sdk_python-7.0.0/tests/test_namespace_barrel_exports.py +26 -0
- dominus_sdk_python-7.0.0/tests/test_stash_artifact_facade.py +355 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/config/__init__.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/config/endpoints.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/__init__.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/auth.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/cache.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/console_capture.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/core.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/crypto.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/sse.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/helpers/trace.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/admin.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/ai.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/artifacts.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/auth.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/browser.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/coder.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/courier.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/db.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/ddl.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/deployer.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/fastapi.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/files.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/health.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/jobs.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/logs.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/platform.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/portal.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/processor.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/publisher.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/recipes.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/redis.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/secrets.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/secure.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/sync.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/warden.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/namespaces/workflow.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus/services/__init__.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/dependency_links.txt +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/requires.txt +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/top_level.txt +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/setup.cfg +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_auth.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_browser_namespace.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_control_plane_namespaces.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_errors.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_flat_commands.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_health.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_logs.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_platform_coder_namespaces.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_provisioning_parity.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_public_exports.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_publisher_namespace.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_recipes_namespace.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_recipes_stash_routing.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_transport_compat.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_workflow_lifecycle.py +0 -0
- {dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/tests/test_workflow_refs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dominus-sdk-python
|
|
3
|
-
Version:
|
|
3
|
+
Version: 7.0.0
|
|
4
4
|
Summary: Python SDK for the Dominus gateway-first platform
|
|
5
5
|
Author-email: CareBridge Systems <dev@carebridge.io>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -35,6 +35,12 @@ Requires-Dist: PyJWT>=2.8.0; extra == "all"
|
|
|
35
35
|
|
|
36
36
|
Async Python SDK for the Dominus gateway-first service plane.
|
|
37
37
|
|
|
38
|
+
## Agent Guide
|
|
39
|
+
|
|
40
|
+
Start with `docs/agent-guide/INDEX.md`. The current snapshot is
|
|
41
|
+
`docs/agent-guide/2026-06-27-0849-agent-guide/00-reading-order.md`; the latest
|
|
42
|
+
cleanup audit is `docs/janitor/2026-06-27-0849-agent-guide-cleanup-audit.md`.
|
|
43
|
+
|
|
38
44
|
## What This Repo Ships
|
|
39
45
|
|
|
40
46
|
- Python 3.9+ asyncio client for Dominus services
|
|
@@ -42,7 +48,7 @@ Async Python SDK for the Dominus gateway-first service plane.
|
|
|
42
48
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
43
49
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
44
50
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
45
|
-
- Current package version: `
|
|
51
|
+
- Current package version: `7.0.0`
|
|
46
52
|
|
|
47
53
|
## Install
|
|
48
54
|
|
|
@@ -223,6 +229,9 @@ JWT and selected scope headers directly through Gateway.
|
|
|
223
229
|
| `warden` | Warden | Thin operator control-plane request surface |
|
|
224
230
|
| `platform` | Platform Worker | Group/repository policy decisions with actor attribution |
|
|
225
231
|
| `coder` | Coder Runtime | Policy-bound Coder run lifecycle with workflow/pipeline recipe launch sources |
|
|
232
|
+
| `publisher` | Publisher | Release/channel/signing build and artifact operations |
|
|
233
|
+
| `stash` | Stash | Stash items, kinds, bookmarks, watches, artifact facade |
|
|
234
|
+
| `recipes` | Recipe Worker | Recipe type registry, publish, validate, get/list |
|
|
226
235
|
| `fastapi` | Local decorators | `@jwt`, `@psk`, `@scopes(...)` |
|
|
227
236
|
|
|
228
237
|
## Root Shortcuts
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Async Python SDK for the Dominus gateway-first service plane.
|
|
4
4
|
|
|
5
|
+
## Agent Guide
|
|
6
|
+
|
|
7
|
+
Start with `docs/agent-guide/INDEX.md`. The current snapshot is
|
|
8
|
+
`docs/agent-guide/2026-06-27-0849-agent-guide/00-reading-order.md`; the latest
|
|
9
|
+
cleanup audit is `docs/janitor/2026-06-27-0849-agent-guide-cleanup-audit.md`.
|
|
10
|
+
|
|
5
11
|
## What This Repo Ships
|
|
6
12
|
|
|
7
13
|
- Python 3.9+ asyncio client for Dominus services
|
|
@@ -9,7 +15,7 @@ Async Python SDK for the Dominus gateway-first service plane.
|
|
|
9
15
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
10
16
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
11
17
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
12
|
-
- Current package version: `
|
|
18
|
+
- Current package version: `7.0.0`
|
|
13
19
|
|
|
14
20
|
## Install
|
|
15
21
|
|
|
@@ -190,6 +196,9 @@ JWT and selected scope headers directly through Gateway.
|
|
|
190
196
|
| `warden` | Warden | Thin operator control-plane request surface |
|
|
191
197
|
| `platform` | Platform Worker | Group/repository policy decisions with actor attribution |
|
|
192
198
|
| `coder` | Coder Runtime | Policy-bound Coder run lifecycle with workflow/pipeline recipe launch sources |
|
|
199
|
+
| `publisher` | Publisher | Release/channel/signing build and artifact operations |
|
|
200
|
+
| `stash` | Stash | Stash items, kinds, bookmarks, watches, artifact facade |
|
|
201
|
+
| `recipes` | Recipe Worker | Recipe type registry, publish, validate, get/list |
|
|
193
202
|
| `fastapi` | Local decorators | `@jwt`, `@psk`, `@scopes(...)` |
|
|
194
203
|
|
|
195
204
|
## Root Shortcuts
|
|
@@ -115,6 +115,7 @@ from .namespaces.warden import WardenNamespace
|
|
|
115
115
|
from .namespaces.platform import PlatformNamespace
|
|
116
116
|
from .namespaces.coder import CoderNamespace
|
|
117
117
|
from .namespaces.publisher import PublisherNamespace
|
|
118
|
+
from .namespaces.stash import StashNamespace
|
|
118
119
|
|
|
119
120
|
# Export AI namespace for agent-runtime operations
|
|
120
121
|
from .namespaces.ai import (
|
|
@@ -160,12 +161,19 @@ from .errors import (
|
|
|
160
161
|
ValidationError,
|
|
161
162
|
ConflictError,
|
|
162
163
|
ServiceError,
|
|
164
|
+
StashBookmarkArtifactNotFound,
|
|
165
|
+
StashBookmarkInvalidVersionRef,
|
|
166
|
+
StashBookmarkDuplicateName,
|
|
167
|
+
StashBookmarkUpstreamRejected,
|
|
168
|
+
StashWatchInvalidWebhookUrl,
|
|
169
|
+
StashWatchUpstreamRejected,
|
|
170
|
+
StashWatchNotFound,
|
|
163
171
|
SecureTableError,
|
|
164
172
|
ConnectionError as DominusConnectionError,
|
|
165
173
|
TimeoutError as DominusTimeoutError,
|
|
166
174
|
)
|
|
167
175
|
|
|
168
|
-
__version__ = "
|
|
176
|
+
__version__ = "7.0.0"
|
|
169
177
|
__all__ = [
|
|
170
178
|
# Main SDK instance
|
|
171
179
|
"dominus",
|
|
@@ -219,6 +227,7 @@ __all__ = [
|
|
|
219
227
|
"PlatformNamespace",
|
|
220
228
|
"CoderNamespace",
|
|
221
229
|
"PublisherNamespace",
|
|
230
|
+
"StashNamespace",
|
|
222
231
|
# AI namespace for agent-runtime operations
|
|
223
232
|
"AiNamespace",
|
|
224
233
|
"RagSubNamespace",
|
|
@@ -250,6 +259,13 @@ __all__ = [
|
|
|
250
259
|
"ValidationError",
|
|
251
260
|
"ConflictError",
|
|
252
261
|
"ServiceError",
|
|
262
|
+
"StashBookmarkArtifactNotFound",
|
|
263
|
+
"StashBookmarkInvalidVersionRef",
|
|
264
|
+
"StashBookmarkDuplicateName",
|
|
265
|
+
"StashBookmarkUpstreamRejected",
|
|
266
|
+
"StashWatchInvalidWebhookUrl",
|
|
267
|
+
"StashWatchUpstreamRejected",
|
|
268
|
+
"StashWatchNotFound",
|
|
253
269
|
"SecureTableError",
|
|
254
270
|
"DominusConnectionError",
|
|
255
271
|
"DominusTimeoutError",
|
|
@@ -205,6 +205,34 @@ class ServiceError(DominusError):
|
|
|
205
205
|
super().__init__(message, status_code, details, endpoint)
|
|
206
206
|
|
|
207
207
|
|
|
208
|
+
class StashBookmarkArtifactNotFound(NotFoundError):
|
|
209
|
+
"""Raised when a stash artifact bookmark target cannot be found."""
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class StashBookmarkInvalidVersionRef(ValidationError):
|
|
213
|
+
"""Raised when a stash artifact bookmark version_ref is invalid."""
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class StashBookmarkDuplicateName(ConflictError):
|
|
217
|
+
"""Raised when a stash artifact bookmark name is already in use."""
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class StashBookmarkUpstreamRejected(ServiceError):
|
|
221
|
+
"""Raised when the artifact backend rejects a stash bookmark operation."""
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class StashWatchInvalidWebhookUrl(ValidationError):
|
|
225
|
+
"""Raised when a stash artifact watcher webhook_url is invalid."""
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class StashWatchUpstreamRejected(ServiceError):
|
|
229
|
+
"""Raised when the artifact backend rejects a stash watch operation."""
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class StashWatchNotFound(NotFoundError):
|
|
233
|
+
"""Raised when a stash artifact watcher cannot be found."""
|
|
234
|
+
|
|
235
|
+
|
|
208
236
|
class ConnectionError(DominusError):
|
|
209
237
|
"""Raised when connection to the backend fails."""
|
|
210
238
|
|
|
@@ -244,6 +272,17 @@ class SecureTableError(DominusError):
|
|
|
244
272
|
super().__init__(message, status_code, details, endpoint)
|
|
245
273
|
|
|
246
274
|
|
|
275
|
+
STASH_ERROR_CLASSES = {
|
|
276
|
+
"stash.bookmark.artifact_not_found": StashBookmarkArtifactNotFound,
|
|
277
|
+
"stash.bookmark.invalid_version_ref": StashBookmarkInvalidVersionRef,
|
|
278
|
+
"stash.bookmark.duplicate_name": StashBookmarkDuplicateName,
|
|
279
|
+
"stash.bookmark.upstream_rejected": StashBookmarkUpstreamRejected,
|
|
280
|
+
"stash.watch.invalid_webhook_url": StashWatchInvalidWebhookUrl,
|
|
281
|
+
"stash.watch.upstream_rejected": StashWatchUpstreamRejected,
|
|
282
|
+
"stash.watch.not_found": StashWatchNotFound,
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
247
286
|
def raise_for_status(
|
|
248
287
|
status_code: int,
|
|
249
288
|
message: str,
|
|
@@ -262,6 +301,7 @@ def raise_for_status(
|
|
|
262
301
|
Raises:
|
|
263
302
|
Appropriate DominusError subclass
|
|
264
303
|
"""
|
|
304
|
+
code = _first_string((details or {}).get("code"))
|
|
265
305
|
error_classes = {
|
|
266
306
|
400: ValidationError,
|
|
267
307
|
401: AuthenticationError,
|
|
@@ -274,5 +314,5 @@ def raise_for_status(
|
|
|
274
314
|
504: TimeoutError,
|
|
275
315
|
}
|
|
276
316
|
|
|
277
|
-
error_class = error_classes.get(status_code, DominusError)
|
|
317
|
+
error_class = STASH_ERROR_CLASSES.get(code) or error_classes.get(status_code, DominusError)
|
|
278
318
|
raise error_class(message, status_code, details, endpoint)
|
|
@@ -21,6 +21,8 @@ from .deployer import DeployerNamespace
|
|
|
21
21
|
from .warden import WardenNamespace
|
|
22
22
|
from .platform import PlatformNamespace
|
|
23
23
|
from .coder import CoderNamespace
|
|
24
|
+
from .publisher import PublisherNamespace
|
|
25
|
+
from .stash import StashNamespace
|
|
24
26
|
from .ai import (
|
|
25
27
|
AiNamespace,
|
|
26
28
|
RagSubNamespace,
|
|
@@ -52,6 +54,8 @@ __all__ = [
|
|
|
52
54
|
"WardenNamespace",
|
|
53
55
|
"PlatformNamespace",
|
|
54
56
|
"CoderNamespace",
|
|
57
|
+
"PublisherNamespace",
|
|
58
|
+
"StashNamespace",
|
|
55
59
|
"AiNamespace",
|
|
56
60
|
"RagSubNamespace",
|
|
57
61
|
"ArtifactsSubNamespace",
|
|
@@ -3,7 +3,7 @@ Authority Namespace - Dominus Authority service surface.
|
|
|
3
3
|
|
|
4
4
|
Canonical SDK entry point for the dominus-authority service. Mirrors the MCP
|
|
5
5
|
``authority_*`` tool surface so application code can drive runs, provisioning
|
|
6
|
-
targets, deploys, managed clients, timelines,
|
|
6
|
+
targets, deploys, managed clients, timelines, verdicts, and Authority context resolution
|
|
7
7
|
without touching workflow-manager / client-worker / deploy-worker routes
|
|
8
8
|
directly.
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@ All methods route through the gateway (``use_gateway=True``) which maps
|
|
|
13
13
|
Run launch is also exposed as ``dominus.workflow.ensure(...)``. Both call
|
|
14
14
|
``/api/authority/runs/ensure``. Use ``dominus.workflow.ensure`` for the
|
|
15
15
|
canonical recipe-backed launch path; use ``dominus.authority.ensure_run`` when
|
|
16
|
-
you want to think in Authority terms (run lifecycle,
|
|
16
|
+
you want to think in Authority terms (run lifecycle, verdicts, retries,
|
|
17
17
|
cancels).
|
|
18
18
|
"""
|
|
19
19
|
from __future__ import annotations
|
|
@@ -74,7 +74,7 @@ class AuthorityNamespace:
|
|
|
74
74
|
subject="PCM47474562",
|
|
75
75
|
)
|
|
76
76
|
await dominus.authority.list_provisioning_targets()
|
|
77
|
-
await dominus.authority.
|
|
77
|
+
await dominus.authority.get_run_verdict(run_id)
|
|
78
78
|
"""
|
|
79
79
|
|
|
80
80
|
def __init__(self, client: "Dominus"):
|
|
@@ -489,27 +489,17 @@ class AuthorityNamespace:
|
|
|
489
489
|
timeout=self._http_timeout(timeout, 30.0),
|
|
490
490
|
)
|
|
491
491
|
|
|
492
|
-
async def
|
|
492
|
+
async def get_run_verdict(
|
|
493
493
|
self,
|
|
494
494
|
run_id: str,
|
|
495
495
|
*,
|
|
496
|
-
since: Optional[str] = None,
|
|
497
|
-
until: Optional[str] = None,
|
|
498
|
-
window_hours: Optional[int] = None,
|
|
499
|
-
limit: Optional[int] = None,
|
|
500
496
|
timeout: Optional[float] = None,
|
|
501
497
|
) -> Dict[str, Any]:
|
|
502
|
-
"""Get the
|
|
498
|
+
"""Get the compact Authority verdict for a run. ``GET /api/authority/runs/{run_id}/verdict``."""
|
|
503
499
|
if not run_id:
|
|
504
500
|
raise ValueError("run_id is required")
|
|
505
|
-
qs = _query_string({
|
|
506
|
-
"since": since,
|
|
507
|
-
"until": until,
|
|
508
|
-
"window_hours": window_hours,
|
|
509
|
-
"limit": limit,
|
|
510
|
-
})
|
|
511
501
|
return await self._get(
|
|
512
|
-
f"/api/authority/
|
|
502
|
+
f"/api/authority/runs/{quote(run_id, safe='')}/verdict",
|
|
513
503
|
timeout=self._http_timeout(timeout, 30.0),
|
|
514
504
|
)
|
|
515
505
|
|
|
@@ -984,39 +974,6 @@ class AuthorityNamespace:
|
|
|
984
974
|
timeout=self._http_timeout(timeout, 30.0),
|
|
985
975
|
)
|
|
986
976
|
|
|
987
|
-
async def get_provisioning_target_dossier(
|
|
988
|
-
self,
|
|
989
|
-
provisioning_target_slug: str,
|
|
990
|
-
*,
|
|
991
|
-
app_slug: Optional[str] = None,
|
|
992
|
-
env: Optional[str] = None,
|
|
993
|
-
target_org_id: Optional[str] = None,
|
|
994
|
-
target_env: Optional[str] = None,
|
|
995
|
-
since: Optional[str] = None,
|
|
996
|
-
until: Optional[str] = None,
|
|
997
|
-
window_hours: Optional[int] = None,
|
|
998
|
-
limit: Optional[int] = None,
|
|
999
|
-
timeout: Optional[float] = None,
|
|
1000
|
-
) -> Dict[str, Any]:
|
|
1001
|
-
"""Get full Authority dossier for a provisioning target. ``GET /api/authority/dossiers/provisioning-target/{provisioning_target_slug}``."""
|
|
1002
|
-
if not provisioning_target_slug:
|
|
1003
|
-
raise ValueError("provisioning_target_slug is required")
|
|
1004
|
-
tid, tev = self._target_query_params(target_org_id, target_env)
|
|
1005
|
-
qs = _query_string({
|
|
1006
|
-
"app_slug": app_slug,
|
|
1007
|
-
"env": env,
|
|
1008
|
-
"target_org_id": tid,
|
|
1009
|
-
"target_env": tev,
|
|
1010
|
-
"since": since,
|
|
1011
|
-
"until": until,
|
|
1012
|
-
"window_hours": window_hours,
|
|
1013
|
-
"limit": limit,
|
|
1014
|
-
})
|
|
1015
|
-
return await self._get(
|
|
1016
|
-
f"/api/authority/dossiers/provisioning-target/{quote(provisioning_target_slug, safe='')}{qs}",
|
|
1017
|
-
timeout=self._http_timeout(timeout, 30.0),
|
|
1018
|
-
)
|
|
1019
|
-
|
|
1020
977
|
# ==================================================================
|
|
1021
978
|
# Deploys
|
|
1022
979
|
# ==================================================================
|
|
@@ -1147,36 +1104,20 @@ class AuthorityNamespace:
|
|
|
1147
1104
|
timeout=self._http_timeout(timeout, 30.0),
|
|
1148
1105
|
)
|
|
1149
1106
|
|
|
1150
|
-
async def
|
|
1107
|
+
async def get_deploy_verdict(
|
|
1151
1108
|
self,
|
|
1152
1109
|
deploy_id: str,
|
|
1153
1110
|
*,
|
|
1154
|
-
since: Optional[str] = None,
|
|
1155
|
-
until: Optional[str] = None,
|
|
1156
|
-
window_hours: Optional[int] = None,
|
|
1157
|
-
limit: Optional[int] = None,
|
|
1158
|
-
full: bool = False,
|
|
1159
1111
|
timeout: Optional[float] = None,
|
|
1160
1112
|
) -> Dict[str, Any]:
|
|
1161
1113
|
"""
|
|
1162
|
-
Get the
|
|
1163
|
-
``GET /api/authority/
|
|
1164
|
-
|
|
1165
|
-
Mirrors the MCP ``authority_get_deploy_dossier`` tool. If the dossier
|
|
1166
|
-
route is not yet enabled in dominus-authority the gateway will return
|
|
1167
|
-
404 — the SDK surface is intentionally aligned with MCP.
|
|
1114
|
+
Get the compact Authority verdict for a deploy.
|
|
1115
|
+
``GET /api/authority/deploys/{deploy_id}/verdict``.
|
|
1168
1116
|
"""
|
|
1169
1117
|
if not deploy_id:
|
|
1170
1118
|
raise ValueError("deploy_id is required")
|
|
1171
|
-
qs = _query_string({
|
|
1172
|
-
"since": since,
|
|
1173
|
-
"until": until,
|
|
1174
|
-
"window_hours": window_hours,
|
|
1175
|
-
"limit": limit,
|
|
1176
|
-
"full": 1 if full else None,
|
|
1177
|
-
})
|
|
1178
1119
|
return await self._get(
|
|
1179
|
-
f"/api/authority/
|
|
1120
|
+
f"/api/authority/deploys/{quote(deploy_id, safe='')}/verdict",
|
|
1180
1121
|
timeout=self._http_timeout(timeout, 30.0),
|
|
1181
1122
|
)
|
|
1182
1123
|
|
|
@@ -6,10 +6,18 @@ stores items in each project's ``stash.*`` schema and transparently falls
|
|
|
6
6
|
back to a designated shared project on read.
|
|
7
7
|
"""
|
|
8
8
|
from typing import Any, Dict, List, Optional, TYPE_CHECKING
|
|
9
|
+
from urllib.parse import urlencode
|
|
9
10
|
|
|
10
11
|
if TYPE_CHECKING:
|
|
11
12
|
from ..start import Dominus
|
|
12
13
|
|
|
14
|
+
BookmarkRef = Dict[str, Any]
|
|
15
|
+
WatcherRef = Dict[str, Any]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _facade_query(*, env: str, kind: str, scope: str, key: str) -> str:
|
|
19
|
+
return urlencode({"env": env, "kind": kind, "scope": scope, "key": key})
|
|
20
|
+
|
|
13
21
|
|
|
14
22
|
class StashNamespace:
|
|
15
23
|
"""
|
|
@@ -273,3 +281,155 @@ class StashNamespace:
|
|
|
273
281
|
body=body,
|
|
274
282
|
use_gateway=True,
|
|
275
283
|
)
|
|
284
|
+
|
|
285
|
+
async def bookmark(
|
|
286
|
+
self,
|
|
287
|
+
*,
|
|
288
|
+
env: str,
|
|
289
|
+
kind: str,
|
|
290
|
+
scope: str,
|
|
291
|
+
key: str,
|
|
292
|
+
name: str,
|
|
293
|
+
version_ref: str,
|
|
294
|
+
timeout: float = 30.0,
|
|
295
|
+
) -> BookmarkRef:
|
|
296
|
+
"""Create or update a named bookmark for a stash artifact facade item."""
|
|
297
|
+
return await self._client._request(
|
|
298
|
+
endpoint="/svc/stash/bookmark",
|
|
299
|
+
method="POST",
|
|
300
|
+
body={
|
|
301
|
+
"env": env,
|
|
302
|
+
"kind": kind,
|
|
303
|
+
"scope": scope,
|
|
304
|
+
"key": key,
|
|
305
|
+
"name": name,
|
|
306
|
+
"version_ref": version_ref,
|
|
307
|
+
},
|
|
308
|
+
use_gateway=True,
|
|
309
|
+
timeout=timeout,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
async def unbookmark(
|
|
313
|
+
self,
|
|
314
|
+
*,
|
|
315
|
+
env: str,
|
|
316
|
+
kind: str,
|
|
317
|
+
scope: str,
|
|
318
|
+
key: str,
|
|
319
|
+
name: str,
|
|
320
|
+
timeout: float = 30.0,
|
|
321
|
+
) -> None:
|
|
322
|
+
"""Remove a named bookmark from a stash artifact facade item."""
|
|
323
|
+
await self._client._request(
|
|
324
|
+
endpoint="/svc/stash/unbookmark",
|
|
325
|
+
method="POST",
|
|
326
|
+
body={
|
|
327
|
+
"env": env,
|
|
328
|
+
"kind": kind,
|
|
329
|
+
"scope": scope,
|
|
330
|
+
"key": key,
|
|
331
|
+
"name": name,
|
|
332
|
+
},
|
|
333
|
+
use_gateway=True,
|
|
334
|
+
timeout=timeout,
|
|
335
|
+
)
|
|
336
|
+
return None
|
|
337
|
+
|
|
338
|
+
async def watch(
|
|
339
|
+
self,
|
|
340
|
+
*,
|
|
341
|
+
env: str,
|
|
342
|
+
kind: str,
|
|
343
|
+
scope: str,
|
|
344
|
+
key: str,
|
|
345
|
+
watcher_name: str,
|
|
346
|
+
webhook_url: str,
|
|
347
|
+
timeout: float = 30.0,
|
|
348
|
+
) -> WatcherRef:
|
|
349
|
+
"""Create or update a webhook watcher for a stash artifact facade item."""
|
|
350
|
+
return await self._client._request(
|
|
351
|
+
endpoint="/svc/stash/watch",
|
|
352
|
+
method="POST",
|
|
353
|
+
body={
|
|
354
|
+
"env": env,
|
|
355
|
+
"kind": kind,
|
|
356
|
+
"scope": scope,
|
|
357
|
+
"key": key,
|
|
358
|
+
"watcher_name": watcher_name,
|
|
359
|
+
"webhook_url": webhook_url,
|
|
360
|
+
},
|
|
361
|
+
use_gateway=True,
|
|
362
|
+
timeout=timeout,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
async def unwatch(
|
|
366
|
+
self,
|
|
367
|
+
*,
|
|
368
|
+
env: str,
|
|
369
|
+
kind: str,
|
|
370
|
+
scope: str,
|
|
371
|
+
key: str,
|
|
372
|
+
watcher_name: str,
|
|
373
|
+
timeout: float = 30.0,
|
|
374
|
+
) -> None:
|
|
375
|
+
"""Remove a webhook watcher from a stash artifact facade item."""
|
|
376
|
+
await self._client._request(
|
|
377
|
+
endpoint="/svc/stash/unwatch",
|
|
378
|
+
method="POST",
|
|
379
|
+
body={
|
|
380
|
+
"env": env,
|
|
381
|
+
"kind": kind,
|
|
382
|
+
"scope": scope,
|
|
383
|
+
"key": key,
|
|
384
|
+
"watcher_name": watcher_name,
|
|
385
|
+
},
|
|
386
|
+
use_gateway=True,
|
|
387
|
+
timeout=timeout,
|
|
388
|
+
)
|
|
389
|
+
return None
|
|
390
|
+
|
|
391
|
+
async def list_bookmarks(
|
|
392
|
+
self,
|
|
393
|
+
*,
|
|
394
|
+
env: str,
|
|
395
|
+
kind: str,
|
|
396
|
+
scope: str,
|
|
397
|
+
key: str,
|
|
398
|
+
timeout: float = 30.0,
|
|
399
|
+
) -> List[BookmarkRef]:
|
|
400
|
+
"""List bookmark refs for a stash artifact facade item."""
|
|
401
|
+
result = await self._client._request(
|
|
402
|
+
endpoint=f"/svc/stash/bookmark/list?{_facade_query(env=env, kind=kind, scope=scope, key=key)}",
|
|
403
|
+
method="GET",
|
|
404
|
+
use_gateway=True,
|
|
405
|
+
timeout=timeout,
|
|
406
|
+
)
|
|
407
|
+
if isinstance(result, list):
|
|
408
|
+
return result
|
|
409
|
+
if isinstance(result, dict):
|
|
410
|
+
bookmarks = result.get("bookmarks")
|
|
411
|
+
return bookmarks if isinstance(bookmarks, list) else []
|
|
412
|
+
return []
|
|
413
|
+
|
|
414
|
+
async def list_watchers(
|
|
415
|
+
self,
|
|
416
|
+
*,
|
|
417
|
+
env: str,
|
|
418
|
+
kind: str,
|
|
419
|
+
scope: str,
|
|
420
|
+
key: str,
|
|
421
|
+
timeout: float = 30.0,
|
|
422
|
+
) -> List[WatcherRef]:
|
|
423
|
+
"""List watcher refs for a stash artifact facade item."""
|
|
424
|
+
result = await self._client._request(
|
|
425
|
+
endpoint=f"/svc/stash/watch/list?{_facade_query(env=env, kind=kind, scope=scope, key=key)}",
|
|
426
|
+
method="GET",
|
|
427
|
+
use_gateway=True,
|
|
428
|
+
timeout=timeout,
|
|
429
|
+
)
|
|
430
|
+
if isinstance(result, list):
|
|
431
|
+
return result
|
|
432
|
+
if isinstance(result, dict):
|
|
433
|
+
watchers = result.get("watchers")
|
|
434
|
+
return watchers if isinstance(watchers, list) else []
|
|
435
|
+
return []
|
|
@@ -168,7 +168,7 @@ class Dominus:
|
|
|
168
168
|
from .namespaces.sync import SyncNamespace
|
|
169
169
|
self.sync = SyncNamespace(self)
|
|
170
170
|
|
|
171
|
-
# Authority service (runs, provisioning targets, deploys, managed clients,
|
|
171
|
+
# Authority service (runs, provisioning targets, deploys, managed clients, verdicts)
|
|
172
172
|
from .namespaces.authority import AuthorityNamespace
|
|
173
173
|
self.authority = AuthorityNamespace(self)
|
|
174
174
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dominus-sdk-python
|
|
3
|
-
Version:
|
|
3
|
+
Version: 7.0.0
|
|
4
4
|
Summary: Python SDK for the Dominus gateway-first platform
|
|
5
5
|
Author-email: CareBridge Systems <dev@carebridge.io>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -35,6 +35,12 @@ Requires-Dist: PyJWT>=2.8.0; extra == "all"
|
|
|
35
35
|
|
|
36
36
|
Async Python SDK for the Dominus gateway-first service plane.
|
|
37
37
|
|
|
38
|
+
## Agent Guide
|
|
39
|
+
|
|
40
|
+
Start with `docs/agent-guide/INDEX.md`. The current snapshot is
|
|
41
|
+
`docs/agent-guide/2026-06-27-0849-agent-guide/00-reading-order.md`; the latest
|
|
42
|
+
cleanup audit is `docs/janitor/2026-06-27-0849-agent-guide-cleanup-audit.md`.
|
|
43
|
+
|
|
38
44
|
## What This Repo Ships
|
|
39
45
|
|
|
40
46
|
- Python 3.9+ asyncio client for Dominus services
|
|
@@ -42,7 +48,7 @@ Async Python SDK for the Dominus gateway-first service plane.
|
|
|
42
48
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
43
49
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
44
50
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
45
|
-
- Current package version: `
|
|
51
|
+
- Current package version: `7.0.0`
|
|
46
52
|
|
|
47
53
|
## Install
|
|
48
54
|
|
|
@@ -223,6 +229,9 @@ JWT and selected scope headers directly through Gateway.
|
|
|
223
229
|
| `warden` | Warden | Thin operator control-plane request surface |
|
|
224
230
|
| `platform` | Platform Worker | Group/repository policy decisions with actor attribution |
|
|
225
231
|
| `coder` | Coder Runtime | Policy-bound Coder run lifecycle with workflow/pipeline recipe launch sources |
|
|
232
|
+
| `publisher` | Publisher | Release/channel/signing build and artifact operations |
|
|
233
|
+
| `stash` | Stash | Stash items, kinds, bookmarks, watches, artifact facade |
|
|
234
|
+
| `recipes` | Recipe Worker | Recipe type registry, publish, validate, get/list |
|
|
226
235
|
| `fastapi` | Local decorators | `@jwt`, `@psk`, `@scopes(...)` |
|
|
227
236
|
|
|
228
237
|
## Root Shortcuts
|
{dominus_sdk_python-6.2.0 → dominus_sdk_python-7.0.0}/dominus_sdk_python.egg-info/SOURCES.txt
RENAMED
|
@@ -56,12 +56,14 @@ tests/test_errors.py
|
|
|
56
56
|
tests/test_flat_commands.py
|
|
57
57
|
tests/test_health.py
|
|
58
58
|
tests/test_logs.py
|
|
59
|
+
tests/test_namespace_barrel_exports.py
|
|
59
60
|
tests/test_platform_coder_namespaces.py
|
|
60
61
|
tests/test_provisioning_parity.py
|
|
61
62
|
tests/test_public_exports.py
|
|
62
63
|
tests/test_publisher_namespace.py
|
|
63
64
|
tests/test_recipes_namespace.py
|
|
64
65
|
tests/test_recipes_stash_routing.py
|
|
66
|
+
tests/test_stash_artifact_facade.py
|
|
65
67
|
tests/test_transport_compat.py
|
|
66
68
|
tests/test_workflow_lifecycle.py
|
|
67
69
|
tests/test_workflow_refs.py
|