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.
Files changed (132) hide show
  1. {spaps-0.5.1 → spaps-0.8.2}/.gitignore +34 -0
  2. spaps-0.8.2/CHANGELOG.md +239 -0
  3. {spaps-0.5.1 → spaps-0.8.2}/FULL_CHECKLIST.md +1 -1
  4. spaps-0.8.2/LICENSE +34 -0
  5. spaps-0.8.2/PKG-INFO +985 -0
  6. spaps-0.8.2/README.md +917 -0
  7. {spaps-0.5.1 → spaps-0.8.2}/TDD_PLAN.md +1 -1
  8. {spaps-0.5.1 → spaps-0.8.2}/pyproject.toml +21 -7
  9. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/__init__.py +298 -4
  10. spaps-0.8.2/src/spaps_client/app_links.py +250 -0
  11. spaps-0.8.2/src/spaps_client/app_links_async.py +163 -0
  12. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/async_client.py +63 -0
  13. spaps-0.8.2/src/spaps_client/auth.py +1911 -0
  14. spaps-0.8.2/src/spaps_client/auth_async.py +1050 -0
  15. spaps-0.8.2/src/spaps_client/capability.py +834 -0
  16. spaps-0.8.2/src/spaps_client/cfo.py +367 -0
  17. spaps-0.8.2/src/spaps_client/cfo_async.py +101 -0
  18. spaps-0.8.2/src/spaps_client/cfo_browser_session.py +324 -0
  19. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/client.py +123 -0
  20. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/crypto.py +30 -9
  21. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/crypto_async.py +13 -3
  22. spaps-0.8.2/src/spaps_client/dayrate.py +240 -0
  23. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/dayrate_async.py +8 -7
  24. spaps-0.8.2/src/spaps_client/dev_portal.py +303 -0
  25. spaps-0.8.2/src/spaps_client/dev_portal_async.py +173 -0
  26. spaps-0.8.2/src/spaps_client/developer_projects.py +343 -0
  27. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/device_flow.py +129 -32
  28. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/email.py +20 -0
  29. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/email_async.py +6 -0
  30. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/entitlements.py +286 -6
  31. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/entitlements_async.py +232 -5
  32. spaps-0.8.2/src/spaps_client/http.py +277 -0
  33. spaps-0.8.2/src/spaps_client/http_async.py +83 -0
  34. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/payments.py +22 -23
  35. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/payments_async.py +6 -4
  36. spaps-0.8.2/src/spaps_client/secure_messages.py +463 -0
  37. spaps-0.8.2/src/spaps_client/secure_messages_async.py +166 -0
  38. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/sessions.py +88 -29
  39. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/sessions_async.py +12 -27
  40. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/storage.py +52 -34
  41. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/support_telemetry.py +11 -4
  42. spaps-0.8.2/src/spaps_client/token_gates.py +378 -0
  43. spaps-0.8.2/src/spaps_client/token_gates_async.py +89 -0
  44. spaps-0.8.2/src/spaps_client/users.py +484 -0
  45. spaps-0.8.2/src/spaps_client/users_async.py +273 -0
  46. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/whitelist.py +59 -25
  47. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/whitelist_async.py +8 -26
  48. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/x402.py +4 -2
  49. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/x402_async.py +4 -2
  50. {spaps-0.5.1 → spaps-0.8.2}/tests/integration/test_build.py +23 -1
  51. {spaps-0.5.1 → spaps-0.8.2}/tests/integration/test_smoke.py +4 -2
  52. spaps-0.8.2/tests/unit/test_app_links.py +248 -0
  53. spaps-0.8.2/tests/unit/test_async_client.py +1076 -0
  54. spaps-0.8.2/tests/unit/test_auth.py +1811 -0
  55. spaps-0.8.2/tests/unit/test_auth_methods_origin.py +87 -0
  56. spaps-0.8.2/tests/unit/test_auth_sessions.py +380 -0
  57. spaps-0.8.2/tests/unit/test_capability.py +312 -0
  58. spaps-0.8.2/tests/unit/test_cfo.py +321 -0
  59. spaps-0.8.2/tests/unit/test_cfo_async.py +104 -0
  60. spaps-0.8.2/tests/unit/test_cfo_browser_session.py +669 -0
  61. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_client.py +30 -1
  62. spaps-0.8.2/tests/unit/test_crypto_invoice_flags.py +43 -0
  63. spaps-0.8.2/tests/unit/test_dayrate.py +182 -0
  64. spaps-0.8.2/tests/unit/test_dev_portal.py +381 -0
  65. spaps-0.8.2/tests/unit/test_dev_portal_async.py +241 -0
  66. spaps-0.8.2/tests/unit/test_developer_projects.py +446 -0
  67. spaps-0.8.2/tests/unit/test_device_flow.py +936 -0
  68. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_email.py +57 -0
  69. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_entitlements.py +461 -0
  70. spaps-0.8.2/tests/unit/test_http.py +357 -0
  71. spaps-0.8.2/tests/unit/test_passkey_parity.py +603 -0
  72. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_payments.py +67 -25
  73. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_quickstart_full_adoption_async.py +12 -13
  74. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_readme_snippets.py +53 -3
  75. spaps-0.8.2/tests/unit/test_recovery_landing_profile.py +149 -0
  76. spaps-0.8.2/tests/unit/test_recovery_mfa.py +325 -0
  77. spaps-0.8.2/tests/unit/test_secure_messages.py +787 -0
  78. spaps-0.8.2/tests/unit/test_sessions.py +559 -0
  79. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_storage.py +62 -6
  80. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_support_telemetry.py +67 -0
  81. spaps-0.8.2/tests/unit/test_token_gates.py +492 -0
  82. spaps-0.8.2/tests/unit/test_token_gates_docs_snippets.py +61 -0
  83. spaps-0.8.2/tests/unit/test_users.py +445 -0
  84. spaps-0.8.2/tests/unit/test_users_async.py +481 -0
  85. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_whitelist.py +144 -7
  86. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_x402.py +47 -0
  87. spaps-0.5.1/CHANGELOG.md +0 -96
  88. spaps-0.5.1/LICENSE +0 -22
  89. spaps-0.5.1/PKG-INFO +0 -602
  90. spaps-0.5.1/README.md +0 -546
  91. spaps-0.5.1/src/spaps_client/auth.py +0 -578
  92. spaps-0.5.1/src/spaps_client/auth_async.py +0 -378
  93. spaps-0.5.1/src/spaps_client/http.py +0 -174
  94. spaps-0.5.1/src/spaps_client/http_async.py +0 -87
  95. spaps-0.5.1/src/spaps_client/secure_messages.py +0 -172
  96. spaps-0.5.1/src/spaps_client/secure_messages_async.py +0 -105
  97. spaps-0.5.1/src/spaps_client/users.py +0 -156
  98. spaps-0.5.1/src/spaps_client/users_async.py +0 -102
  99. spaps-0.5.1/tests/unit/test_async_client.py +0 -411
  100. spaps-0.5.1/tests/unit/test_auth.py +0 -577
  101. spaps-0.5.1/tests/unit/test_device_flow.py +0 -430
  102. spaps-0.5.1/tests/unit/test_http.py +0 -116
  103. spaps-0.5.1/tests/unit/test_secure_messages.py +0 -127
  104. spaps-0.5.1/tests/unit/test_sessions.py +0 -283
  105. spaps-0.5.1/tests/unit/test_users.py +0 -164
  106. spaps-0.5.1/tests/unit/test_users_async.py +0 -252
  107. {spaps-0.5.1 → spaps-0.8.2}/TODO.md +0 -0
  108. {spaps-0.5.1 → spaps-0.8.2}/docs/RELEASE_CHECKLIST.md +0 -0
  109. {spaps-0.5.1 → spaps-0.8.2}/scripts/manage_version.py +0 -0
  110. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/config.py +0 -0
  111. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/issue_reporting.py +0 -0
  112. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/issue_reporting_async.py +0 -0
  113. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/marketing.py +0 -0
  114. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/metrics.py +0 -0
  115. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/metrics_async.py +0 -0
  116. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/permissions.py +0 -0
  117. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/py.typed +0 -0
  118. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/skill_evals.py +0 -0
  119. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/skill_evals_async.py +0 -0
  120. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/usage.py +0 -0
  121. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/usage_async.py +0 -0
  122. {spaps-0.5.1 → spaps-0.8.2}/src/spaps_client/webhooks.py +0 -0
  123. {spaps-0.5.1 → spaps-0.8.2}/tests/conftest.py +0 -0
  124. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_config.py +0 -0
  125. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_issue_reporting.py +0 -0
  126. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_marketing.py +0 -0
  127. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_metadata.py +0 -0
  128. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_metrics.py +0 -0
  129. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_permissions.py +0 -0
  130. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_skill_evals.py +0 -0
  131. {spaps-0.5.1 → spaps-0.8.2}/tests/unit/test_usage.py +0 -0
  132. {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/
@@ -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 (existing)
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.