spaps 0.5.1__tar.gz → 0.8.2__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.
- {spaps-0.5.1 → spaps-0.8.2}/.gitignore +34 -0
- spaps-0.8.2/CHANGELOG.md +239 -0
- {spaps-0.5.1 → spaps-0.8.2}/FULL_CHECKLIST.md +1 -1
- spaps-0.8.2/LICENSE +34 -0
- spaps-0.8.2/PKG-INFO +985 -0
- spaps-0.8.2/README.md +917 -0
- {spaps-0.5.1 → spaps-0.8.2}/TDD_PLAN.md +1 -1
- {spaps-0.5.1 → spaps-0.8.2}/pyproject.toml +21 -7
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/__init__.py +298 -4
- spaps-0.8.2/src/spaps_client/app_links.py +250 -0
- spaps-0.8.2/src/spaps_client/app_links_async.py +163 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/async_client.py +63 -0
- spaps-0.8.2/src/spaps_client/auth.py +1911 -0
- spaps-0.8.2/src/spaps_client/auth_async.py +1050 -0
- spaps-0.8.2/src/spaps_client/capability.py +834 -0
- spaps-0.8.2/src/spaps_client/cfo.py +367 -0
- spaps-0.8.2/src/spaps_client/cfo_async.py +101 -0
- spaps-0.8.2/src/spaps_client/cfo_browser_session.py +324 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/client.py +123 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/crypto.py +30 -9
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/crypto_async.py +13 -3
- spaps-0.8.2/src/spaps_client/dayrate.py +240 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/dayrate_async.py +8 -7
- spaps-0.8.2/src/spaps_client/dev_portal.py +303 -0
- spaps-0.8.2/src/spaps_client/dev_portal_async.py +173 -0
- spaps-0.8.2/src/spaps_client/developer_projects.py +343 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/device_flow.py +129 -32
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/email.py +20 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/email_async.py +6 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/entitlements.py +286 -6
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/entitlements_async.py +232 -5
- spaps-0.8.2/src/spaps_client/http.py +277 -0
- spaps-0.8.2/src/spaps_client/http_async.py +83 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/payments.py +22 -23
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/payments_async.py +6 -4
- spaps-0.8.2/src/spaps_client/secure_messages.py +463 -0
- spaps-0.8.2/src/spaps_client/secure_messages_async.py +166 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/sessions.py +88 -29
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/sessions_async.py +12 -27
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/storage.py +52 -34
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/support_telemetry.py +11 -4
- spaps-0.8.2/src/spaps_client/token_gates.py +378 -0
- spaps-0.8.2/src/spaps_client/token_gates_async.py +89 -0
- spaps-0.8.2/src/spaps_client/users.py +484 -0
- spaps-0.8.2/src/spaps_client/users_async.py +273 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/whitelist.py +59 -25
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/whitelist_async.py +8 -26
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/x402.py +4 -2
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/x402_async.py +4 -2
- {spaps-0.5.1 → spaps-0.8.2}/tests/integration/test_build.py +23 -1
- {spaps-0.5.1 → spaps-0.8.2}/tests/integration/test_smoke.py +4 -2
- spaps-0.8.2/tests/unit/test_app_links.py +248 -0
- spaps-0.8.2/tests/unit/test_async_client.py +1076 -0
- spaps-0.8.2/tests/unit/test_auth.py +1811 -0
- spaps-0.8.2/tests/unit/test_auth_methods_origin.py +87 -0
- spaps-0.8.2/tests/unit/test_auth_sessions.py +380 -0
- spaps-0.8.2/tests/unit/test_capability.py +312 -0
- spaps-0.8.2/tests/unit/test_cfo.py +321 -0
- spaps-0.8.2/tests/unit/test_cfo_async.py +104 -0
- spaps-0.8.2/tests/unit/test_cfo_browser_session.py +669 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_client.py +30 -1
- spaps-0.8.2/tests/unit/test_crypto_invoice_flags.py +43 -0
- spaps-0.8.2/tests/unit/test_dayrate.py +182 -0
- spaps-0.8.2/tests/unit/test_dev_portal.py +381 -0
- spaps-0.8.2/tests/unit/test_dev_portal_async.py +241 -0
- spaps-0.8.2/tests/unit/test_developer_projects.py +446 -0
- spaps-0.8.2/tests/unit/test_device_flow.py +936 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_email.py +57 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_entitlements.py +461 -0
- spaps-0.8.2/tests/unit/test_http.py +357 -0
- spaps-0.8.2/tests/unit/test_passkey_parity.py +603 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_payments.py +67 -25
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_quickstart_full_adoption_async.py +12 -13
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_readme_snippets.py +53 -3
- spaps-0.8.2/tests/unit/test_recovery_landing_profile.py +149 -0
- spaps-0.8.2/tests/unit/test_recovery_mfa.py +325 -0
- spaps-0.8.2/tests/unit/test_secure_messages.py +787 -0
- spaps-0.8.2/tests/unit/test_sessions.py +559 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_storage.py +62 -6
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_support_telemetry.py +67 -0
- spaps-0.8.2/tests/unit/test_token_gates.py +492 -0
- spaps-0.8.2/tests/unit/test_token_gates_docs_snippets.py +61 -0
- spaps-0.8.2/tests/unit/test_users.py +445 -0
- spaps-0.8.2/tests/unit/test_users_async.py +481 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_whitelist.py +144 -7
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_x402.py +47 -0
- spaps-0.5.1/CHANGELOG.md +0 -96
- spaps-0.5.1/LICENSE +0 -22
- spaps-0.5.1/PKG-INFO +0 -602
- spaps-0.5.1/README.md +0 -546
- spaps-0.5.1/src/spaps_client/auth.py +0 -578
- spaps-0.5.1/src/spaps_client/auth_async.py +0 -378
- spaps-0.5.1/src/spaps_client/http.py +0 -174
- spaps-0.5.1/src/spaps_client/http_async.py +0 -87
- spaps-0.5.1/src/spaps_client/secure_messages.py +0 -172
- spaps-0.5.1/src/spaps_client/secure_messages_async.py +0 -105
- spaps-0.5.1/src/spaps_client/users.py +0 -156
- spaps-0.5.1/src/spaps_client/users_async.py +0 -102
- spaps-0.5.1/tests/unit/test_async_client.py +0 -411
- spaps-0.5.1/tests/unit/test_auth.py +0 -577
- spaps-0.5.1/tests/unit/test_device_flow.py +0 -430
- spaps-0.5.1/tests/unit/test_http.py +0 -116
- spaps-0.5.1/tests/unit/test_secure_messages.py +0 -127
- spaps-0.5.1/tests/unit/test_sessions.py +0 -283
- spaps-0.5.1/tests/unit/test_users.py +0 -164
- spaps-0.5.1/tests/unit/test_users_async.py +0 -252
- {spaps-0.5.1 → spaps-0.8.2}/TODO.md +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/docs/RELEASE_CHECKLIST.md +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/scripts/manage_version.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/config.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/issue_reporting.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/issue_reporting_async.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/marketing.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/metrics.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/metrics_async.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/permissions.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/py.typed +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/skill_evals.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/skill_evals_async.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/usage.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/usage_async.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/webhooks.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/conftest.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_config.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_issue_reporting.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_marketing.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_metadata.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_metrics.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_permissions.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_skill_evals.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_usage.py +0 -0
- {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_webhooks.py +0 -0
|
@@ -30,6 +30,7 @@ coverage-*/
|
|
|
30
30
|
**/.testmondata
|
|
31
31
|
**/.testmondata-shm
|
|
32
32
|
**/.testmondata-wal
|
|
33
|
+
packages/python-server-quickstart/tests/benchmarks/.artifacts/
|
|
33
34
|
*.lcov
|
|
34
35
|
**/lcov.info
|
|
35
36
|
**/lcov-report/
|
|
@@ -164,6 +165,9 @@ backup-feb8.sql
|
|
|
164
165
|
# Local modes/swarm artifacts
|
|
165
166
|
.ntm/
|
|
166
167
|
.skillbox/
|
|
168
|
+
artifacts/openapi-contract/
|
|
169
|
+
# Local-only secret inventory; canonical is docs/security/SECRET_EXPOSURE_REPORT.md
|
|
170
|
+
artifacts/SECRET_EXPOSURE_REPORT.md
|
|
167
171
|
MODES_ANALYSIS_PROGRESS.md
|
|
168
172
|
MODES_OF_REASONING_REPORT_AND_ANALYSIS_OF_PROJECT.md
|
|
169
173
|
MODE_OUTPUT_*.md
|
|
@@ -200,3 +204,33 @@ refactor/
|
|
|
200
204
|
|
|
201
205
|
# bv (beads viewer) local config and caches
|
|
202
206
|
.bv/
|
|
207
|
+
|
|
208
|
+
# Beads compliance audit dir (managed by /beads-compliance-and-completion-verification skill)
|
|
209
|
+
/beads_compliance_audit/
|
|
210
|
+
|
|
211
|
+
# Local agent ideation and graph-export artifacts
|
|
212
|
+
/.agent-artifacts/
|
|
213
|
+
/DUELING_*
|
|
214
|
+
/WIZARD_*
|
|
215
|
+
/MODE_OUTPUT_*
|
|
216
|
+
/.beads-public-client-graph.sh
|
|
217
|
+
.release/
|
|
218
|
+
|
|
219
|
+
# Amp Orb repository hooks/config are tracked. Only generated runtime state is
|
|
220
|
+
# ignored; do not blanket-ignore .agents/ or .amp/.
|
|
221
|
+
/.agents/cache/
|
|
222
|
+
/.agents/skills/
|
|
223
|
+
/.agents/logs/
|
|
224
|
+
/.agents/state/
|
|
225
|
+
/.agents/tools/
|
|
226
|
+
/.agents/amp-context/__pycache__/
|
|
227
|
+
/.amp/live-sync.pid
|
|
228
|
+
/.amp/portals/
|
|
229
|
+
/.amp/resume-last-ran.txt
|
|
230
|
+
|
|
231
|
+
# Production environment drafts belong in the out-of-tree environment manager.
|
|
232
|
+
python-prod.env.draft
|
|
233
|
+
**/python-prod.env.draft
|
|
234
|
+
|
|
235
|
+
# Generated Authentication reference app (see packages/spaps/scripts/serve-auth-reference.mjs)
|
|
236
|
+
packages/spaps/.auth-reference/
|
spaps-0.8.2/CHANGELOG.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
- No changes yet.
|
|
10
|
+
|
|
11
|
+
## [0.8.2] - 2026-10-01
|
|
12
|
+
|
|
13
|
+
**Unpublished source candidate.** Supersedes tagged but unpublished `0.8.1`.
|
|
14
|
+
|
|
15
|
+
- Repack the reviewed source cohort with corrected exact-artifact inspection; no Python client API change.
|
|
16
|
+
|
|
17
|
+
## [0.8.1] - 2026-09-30
|
|
18
|
+
|
|
19
|
+
**Unpublished source candidate.** Supersedes the tagged but unpublished
|
|
20
|
+
`0.8.0` candidate in the coordinated package release.
|
|
21
|
+
|
|
22
|
+
## [0.8.0] - 2026-09-30
|
|
23
|
+
|
|
24
|
+
**Unpublished source candidate.** This version has not passed the coordinated
|
|
25
|
+
package review or been published. The last published version is `0.6.2`;
|
|
26
|
+
`0.8.0` also includes the changes recorded under the unpublished `0.7.x`
|
|
27
|
+
checkpoints below.
|
|
28
|
+
|
|
29
|
+
This candidate includes the source changes after the `0.7.2` checkpoint.
|
|
30
|
+
The pair-scoped secure-message API and removal of offset paging are breaking
|
|
31
|
+
changes; migrate callers before upgrading.
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Added the secure-message **authorship contract** (server revision `000000000094`) to the sync
|
|
36
|
+
`SecureMessagesClient` and async `AsyncSecureMessagesClient`: responses now carry
|
|
37
|
+
`sender_user_id`, `sender_role`, and `client_message_id`, and `SecureMessage.has_known_sender`
|
|
38
|
+
is the branch point for messages written before that revision, whose authorship is genuinely
|
|
39
|
+
unknown and is never back-filled from `patient_id` / `practitioner_id`.
|
|
40
|
+
- Added idempotent sends via `create_message(..., client_message_id=...)`. The token is bounded to
|
|
41
|
+
1-200 characters locally, mirroring the server `CHECK` constraint
|
|
42
|
+
`ck_secure_messages_client_message_id_len`, so an oversized token is a `ValueError` instead of a
|
|
43
|
+
round trip that ends in a 400. Retrying with the same token, as the same authenticated sender and
|
|
44
|
+
with the same pair/content/metadata, returns the original message; reusing it for a different
|
|
45
|
+
message is `409 SECURE_MESSAGES_IDEMPOTENCY_CONFLICT`.
|
|
46
|
+
- Added `iter_messages(patient_id=..., practitioner_id=...)` on both surfaces, which follows the
|
|
47
|
+
keyset `next_cursor` to the end of one conversation.
|
|
48
|
+
- Exported `SENDER_ROLE_PATIENT`, `SENDER_ROLE_PRACTITIONER`, `MIN_CLIENT_MESSAGE_ID_LENGTH`,
|
|
49
|
+
`MAX_CLIENT_MESSAGE_ID_LENGTH` from `spaps_client`, and `FORBIDDEN_SENDER_KEYS` plus the
|
|
50
|
+
`SECURE_MESSAGES_*` error codes from `spaps_client.secure_messages`, so consumers branch on the
|
|
51
|
+
server vocabulary instead of hand-copied strings.
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **BREAKING.** `GET /api/secure-messages` is now pair-scoped. `list_messages` and `iter_messages`
|
|
56
|
+
take `patient_id` and `practitioner_id` as required keyword arguments on both the sync and async
|
|
57
|
+
surfaces; there is no "all my messages" read. An empty id raises `ValueError` locally rather than
|
|
58
|
+
issuing a request the server will reject.
|
|
59
|
+
- **BREAKING.** `offset` paging is gone. The server answers a non-zero `offset` with
|
|
60
|
+
`400 SECURE_MESSAGES_OFFSET_UNSUPPORTED` because offset paging over an append-only conversation
|
|
61
|
+
drops or repeats messages, so the clients have no `offset` parameter at all and never emit the
|
|
62
|
+
query key. Replace any offset loop with `iter_messages(...)` or a manual `cursor` loop.
|
|
63
|
+
- The message author is derived server-side from the authenticated JWT and can never be supplied by
|
|
64
|
+
a caller. Neither `create_message` accepts a sender argument in any spelling, and
|
|
65
|
+
`FORBIDDEN_SENDER_KEYS` (`senderUserId`, `sender_user_id`, `senderRole`, `sender_role`) is
|
|
66
|
+
asserted absent from every outgoing body before the request is built.
|
|
67
|
+
- The async client delegates to the same `build_create_payload` / `build_list_params` / `build_page`
|
|
68
|
+
helpers as the sync client, so the two surfaces cannot drift on which keys they send.
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- Local `0.7.2` candidate: accept explicit `wallets: null` as an empty wallet list when public
|
|
73
|
+
sync and async auth clients decode user profiles, while retaining validation for malformed
|
|
74
|
+
non-null wallet values.
|
|
75
|
+
|
|
76
|
+
## [0.7.2] - 2026-09-14
|
|
77
|
+
|
|
78
|
+
**Unreleased source checkpoint.** This date records source commit
|
|
79
|
+
`c52a7b0d82e5991f3abd807f5ccf5949af81c651`, not package publication.
|
|
80
|
+
The Unreleased entries above remain pending; this checkpoint does not
|
|
81
|
+
assign them to a release.
|
|
82
|
+
|
|
83
|
+
### Fixed
|
|
84
|
+
|
|
85
|
+
- Accept explicit `wallets: null` as an empty wallet list when sync and
|
|
86
|
+
async auth clients decode user profiles. Malformed non-null values
|
|
87
|
+
still fail validation.
|
|
88
|
+
|
|
89
|
+
## [0.7.1] - 2026-07-28
|
|
90
|
+
|
|
91
|
+
### Fixed
|
|
92
|
+
|
|
93
|
+
- Excluded generated coverage databases from source distributions and made the
|
|
94
|
+
release inspector reject build-host coverage material.
|
|
95
|
+
- Pinned the release-gate Ruff version and made package timestamps derive from
|
|
96
|
+
the exact source commit.
|
|
97
|
+
- Superseded the quarantined unpublished `0.7.0` manifest; its wheel and sdist
|
|
98
|
+
remain rejected audit history.
|
|
99
|
+
|
|
100
|
+
## [0.7.0] - 2026-07-15
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
|
|
104
|
+
- Added inverse sync/async Python helpers and typed models for all 23 passkey operations: raw ceremonies, passkey-first bootstrap, credential lifecycle, application profiles, action-bound step-up, user recovery, and administrator recovery.
|
|
105
|
+
- Added explicit WebAuthn `Origin` forwarding, exact public/user/admin authentication behavior, typed recovery grant rotation, and token storage only for token-issuing passkey responses.
|
|
106
|
+
|
|
107
|
+
### Fixed
|
|
108
|
+
|
|
109
|
+
- Preserved passkey API error details and top-level request IDs in `AuthError`, while keeping response-header request IDs authoritative.
|
|
110
|
+
|
|
111
|
+
## [0.6.2] - 2026-06-16
|
|
112
|
+
|
|
113
|
+
### Fixed
|
|
114
|
+
|
|
115
|
+
- Accepted `stream`, `owner_id`, `subject_override`, and `body_override` on `EmailClient.send()` and accepted `stream` on `AsyncEmailClient.send()` so Python consumers can delegate SPAPS email sends without hand-rolling the `/api/email/send` envelope.
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
|
|
119
|
+
- Bumped the Python client package metadata to `0.6.2`.
|
|
120
|
+
|
|
121
|
+
## [0.6.1] - 2026-06-14
|
|
122
|
+
|
|
123
|
+
### Added
|
|
124
|
+
|
|
125
|
+
- Added sync `DayrateClient` helpers and sync/async `AppLinksClient` helpers, with high-level `SpapsClient.dayrate`, `SpapsClient.app_links`, and `AsyncSpapsClient.app_links` accessors.
|
|
126
|
+
- Added sync and async `UsersClient.memberships` helpers for listing, inviting/adding, and removing app account users.
|
|
127
|
+
- Added sync and async `EntitlementsClient.project_grants` helpers for granting, revoking, listing, checking, and claiming project access grants.
|
|
128
|
+
|
|
129
|
+
### Fixed
|
|
130
|
+
|
|
131
|
+
- Accepted canonical SPAPS password reset request envelopes that return `success`, `data.email`, `data.sent_at`, `request_id`, and `timestamp` without requiring a top-level English `message`.
|
|
132
|
+
- Exposed omitted password reset request messages as `None` instead of an empty string placeholder so apps keep ownership of success copy.
|
|
133
|
+
- Preserved password reset confirmation parsing for canonical envelopes where the success copy lives at `data.message`.
|
|
134
|
+
|
|
135
|
+
### Changed
|
|
136
|
+
|
|
137
|
+
- Bumped the Python client package metadata to `0.6.1`; HTMA should consume `spaps>=0.6.1` or the matching unreleased local wheel/source checkout before retrying the reset flow.
|
|
138
|
+
|
|
139
|
+
## [0.6.0] - 2026-06-13
|
|
140
|
+
|
|
141
|
+
### Added
|
|
142
|
+
|
|
143
|
+
- Added sync and async auth helpers for OIDC nonce/sign-in, WebAuthn registration/assertion, TOTP MFA enrollment/verification/disable, and SMS OTP request/verify flows.
|
|
144
|
+
- Added typed MFA challenge responses so token-issuing auth methods can return either tokens or an MFA challenge without storing incomplete credentials.
|
|
145
|
+
|
|
146
|
+
### Changed
|
|
147
|
+
|
|
148
|
+
- Bumped the Python client package metadata to `0.6.0`.
|
|
149
|
+
|
|
150
|
+
## [0.5.1] - 2026-06-04
|
|
151
|
+
|
|
152
|
+
### Added
|
|
153
|
+
|
|
154
|
+
- Added sync and async issue-reporting screenshot attachment helpers for private upload, list, access URL, delete, and attach-by-ID create/update/reply flows.
|
|
155
|
+
|
|
156
|
+
## [0.5.0] - 2026-03-29
|
|
157
|
+
|
|
158
|
+
### Added
|
|
159
|
+
|
|
160
|
+
- End-user issue-report flows across the Python client surface.
|
|
161
|
+
- Support-telemetry helpers aligned with the current SPAPS platform APIs.
|
|
162
|
+
|
|
163
|
+
### Changed
|
|
164
|
+
|
|
165
|
+
- Refreshed package docs and OSS-facing references for the published client surface.
|
|
166
|
+
|
|
167
|
+
## [0.4.1] - 2026-02-18
|
|
168
|
+
|
|
169
|
+
### Changed
|
|
170
|
+
|
|
171
|
+
- Relaxed required fields in email and entitlement schemas for forward compatibility.
|
|
172
|
+
- Relaxed `Entitlement.source` from `Literal` to `str` to accept newly introduced source types without forcing immediate client upgrades.
|
|
173
|
+
|
|
174
|
+
## [0.4.0] - 2026-02-17
|
|
175
|
+
|
|
176
|
+
### Added
|
|
177
|
+
|
|
178
|
+
- `UsersClient` and `AsyncUsersClient` for user management operations.
|
|
179
|
+
- Async quickstart parity wrappers aligned with server-side helpers.
|
|
180
|
+
- Referral fields in registration flow.
|
|
181
|
+
|
|
182
|
+
## [0.3.0] - 2026-02-11
|
|
183
|
+
|
|
184
|
+
### Changed
|
|
185
|
+
|
|
186
|
+
- Consolidated SPAPS integration patterns into published packages.
|
|
187
|
+
- Aligned Python client surface area with production SPAPS APIs.
|
|
188
|
+
|
|
189
|
+
## [0.2.0] - 2025-12-30
|
|
190
|
+
|
|
191
|
+
### Added
|
|
192
|
+
|
|
193
|
+
- Broader SDK coverage to support production cutover requirements.
|
|
194
|
+
- Email-service and set-password endpoint client stubs.
|
|
195
|
+
|
|
196
|
+
### Changed
|
|
197
|
+
|
|
198
|
+
- Standardized configuration defaults (including port `3301` and environment symlink conventions).
|
|
199
|
+
|
|
200
|
+
## [0.1.4] - 2025-11-09
|
|
201
|
+
|
|
202
|
+
### Fixed
|
|
203
|
+
|
|
204
|
+
- Session validation response parsing for the `valid` field contract.
|
|
205
|
+
|
|
206
|
+
## [0.1.3] - 2025-10-14
|
|
207
|
+
|
|
208
|
+
### Added
|
|
209
|
+
|
|
210
|
+
- Subscription list/detail/cancel/swap helpers to match TypeScript SDK behavior.
|
|
211
|
+
- Checkout session lookup/list/expire and guest checkout lifecycle helpers.
|
|
212
|
+
- Stripe payment history summaries and payment-detail retrieval.
|
|
213
|
+
- Client-side role/permission utilities in `spaps_client.permissions`.
|
|
214
|
+
|
|
215
|
+
### Changed
|
|
216
|
+
|
|
217
|
+
- Refreshed README examples for newly added helpers.
|
|
218
|
+
|
|
219
|
+
## [0.1.2] - 2025-10-12
|
|
220
|
+
|
|
221
|
+
### Changed
|
|
222
|
+
|
|
223
|
+
- Standardized crypto invoice lookup helper behavior and logging paths.
|
|
224
|
+
|
|
225
|
+
## [0.1.1] - 2025-10-11
|
|
226
|
+
|
|
227
|
+
### Changed
|
|
228
|
+
|
|
229
|
+
- Widened `httpx` dependency range to `<0.29` for FastAPI default-stack compatibility (`0.28.x`).
|
|
230
|
+
|
|
231
|
+
## [0.1.0] - 2025-10-11
|
|
232
|
+
|
|
233
|
+
### Added
|
|
234
|
+
|
|
235
|
+
- Initial public PyPI release under the `spaps` distribution name.
|
|
236
|
+
- Sync and async clients for sessions, payments (including crypto), usage, whitelist, secure messages, and metrics.
|
|
237
|
+
- Configurable retry/backoff behavior, logging hooks, and token storage abstractions.
|
|
238
|
+
- Linting/type-checking/coverage gates integrated with the release workflow.
|
|
239
|
+
- Python quickstart documentation and backend integration guide.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- [x] Payments: update payment method
|
|
13
13
|
- [x] Payments: Stripe checkout (existing)
|
|
14
14
|
- [x] Payments: Stripe payment intent (existing)
|
|
15
|
-
- [x] Payments: wallet deposit/status
|
|
15
|
+
- [x] Payments: wallet deposit/status helpers intentionally raise `NotImplementedError` for backend 501 stubs
|
|
16
16
|
- [x] Payments: subscription details/cancel (existing)
|
|
17
17
|
- [x] Payments: crypto invoices (create/get/reconcile)
|
|
18
18
|
- [x] Payments: crypto webhooks signature helper
|
spaps-0.8.2/LICENSE
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
SWEET POTATO / SPAPS PROPRIETARY LICENSE NOTICE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 build000r. All rights reserved.
|
|
4
|
+
|
|
5
|
+
Sweet Potato / SPAPS, including its source code, documentation, first-party
|
|
6
|
+
packages, schemas, designs, and related materials (collectively, the
|
|
7
|
+
"Software"), is proprietary.
|
|
8
|
+
|
|
9
|
+
No license or permission is granted to use, copy, modify, merge, publish,
|
|
10
|
+
distribute, sublicense, sell, host, operate, reverse engineer, expose as a
|
|
11
|
+
service, or create derivative works from the Software except as expressly
|
|
12
|
+
authorized by a separate written agreement with build000r.
|
|
13
|
+
|
|
14
|
+
Authorized customers may use first-party client packages and documentation
|
|
15
|
+
solely to integrate with the hosted Sweet Potato / SPAPS service while their
|
|
16
|
+
paid subscription remains active and subject to the applicable service terms.
|
|
17
|
+
Possession of source code, a package artifact, a container image, documentation,
|
|
18
|
+
or an API credential does not grant ownership of the Software or a right to
|
|
19
|
+
deploy, redistribute, resell, or operate the SPAPS backend.
|
|
20
|
+
|
|
21
|
+
Third-party software included with or used by the Software remains governed by
|
|
22
|
+
its own license terms.
|
|
23
|
+
|
|
24
|
+
Versions of any material that were previously distributed with a different
|
|
25
|
+
license remain governed by the license that accompanied those versions. This
|
|
26
|
+
notice does not retroactively revoke rights that were already granted under an
|
|
27
|
+
earlier license.
|
|
28
|
+
|
|
29
|
+
THE SOFTWARE AND HOSTED SERVICE ARE PROVIDED "AS IS" AND "AS AVAILABLE," WITHOUT
|
|
30
|
+
WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES
|
|
31
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
|
|
32
|
+
NONINFRINGEMENT. TO THE MAXIMUM EXTENT PERMITTED BY LAW, BUILD000R SHALL NOT BE
|
|
33
|
+
LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM OR RELATED TO THE
|
|
34
|
+
SOFTWARE, THE HOSTED SERVICE, OR THEIR USE.
|