spaps 0.6.2__tar.gz → 0.8.3__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 (147) hide show
  1. {spaps-0.6.2 → spaps-0.8.3}/.gitignore +32 -2
  2. spaps-0.8.3/CHANGELOG.md +260 -0
  3. spaps-0.8.3/LICENSE +34 -0
  4. spaps-0.6.2/README.md → spaps-0.8.3/PKG-INFO +323 -15
  5. spaps-0.6.2/PKG-INFO → spaps-0.8.3/README.md +255 -71
  6. {spaps-0.6.2 → spaps-0.8.3}/TDD_PLAN.md +1 -1
  7. spaps-0.8.3/docs/account-security.md +61 -0
  8. {spaps-0.6.2 → spaps-0.8.3}/pyproject.toml +17 -7
  9. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/__init__.py +249 -1
  10. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/app_links.py +43 -23
  11. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/app_links_async.py +3 -23
  12. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/async_client.py +78 -0
  13. spaps-0.8.3/src/spaps_client/auth.py +2716 -0
  14. spaps-0.8.3/src/spaps_client/auth_async.py +1688 -0
  15. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/capability.py +79 -22
  16. spaps-0.8.3/src/spaps_client/cfo.py +367 -0
  17. spaps-0.8.3/src/spaps_client/cfo_actions.py +417 -0
  18. spaps-0.8.3/src/spaps_client/cfo_async.py +101 -0
  19. spaps-0.8.3/src/spaps_client/cfo_browser_session.py +324 -0
  20. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/client.py +97 -0
  21. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/crypto.py +19 -3
  22. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/crypto_async.py +13 -3
  23. spaps-0.8.3/src/spaps_client/dashboard.py +545 -0
  24. spaps-0.8.3/src/spaps_client/dashboard_async.py +360 -0
  25. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/dayrate.py +8 -7
  26. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/dayrate_async.py +8 -7
  27. spaps-0.8.3/src/spaps_client/dev_portal.py +323 -0
  28. spaps-0.8.3/src/spaps_client/dev_portal_async.py +179 -0
  29. spaps-0.8.3/src/spaps_client/developer_projects.py +343 -0
  30. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/device_flow.py +129 -32
  31. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/email.py +4 -0
  32. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/email_async.py +3 -0
  33. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/entitlements.py +14 -7
  34. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/entitlements_async.py +8 -4
  35. spaps-0.8.3/src/spaps_client/http.py +277 -0
  36. spaps-0.8.3/src/spaps_client/http_async.py +83 -0
  37. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/payments.py +41 -21
  38. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/payments_async.py +21 -1
  39. spaps-0.8.3/src/spaps_client/purchase_journeys.py +541 -0
  40. spaps-0.8.3/src/spaps_client/purchase_journeys_async.py +131 -0
  41. spaps-0.8.3/src/spaps_client/secure_messages.py +463 -0
  42. spaps-0.8.3/src/spaps_client/secure_messages_async.py +166 -0
  43. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/sessions.py +84 -26
  44. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/sessions_async.py +8 -23
  45. spaps-0.8.3/src/spaps_client/storage.py +295 -0
  46. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/support_telemetry.py +11 -4
  47. spaps-0.8.3/src/spaps_client/token_gates.py +378 -0
  48. spaps-0.8.3/src/spaps_client/token_gates_async.py +89 -0
  49. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/users.py +95 -20
  50. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/users_async.py +24 -23
  51. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/webhooks.py +1 -1
  52. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/whitelist.py +115 -54
  53. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/whitelist_async.py +19 -53
  54. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/x402.py +4 -2
  55. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/x402_async.py +4 -2
  56. {spaps-0.6.2 → spaps-0.8.3}/tests/integration/test_smoke.py +4 -2
  57. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_app_links.py +72 -1
  58. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_async_client.py +241 -3
  59. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_auth.py +719 -3
  60. spaps-0.8.3/tests/unit/test_auth_methods_origin.py +87 -0
  61. spaps-0.8.3/tests/unit/test_auth_security_parity.py +495 -0
  62. spaps-0.8.3/tests/unit/test_auth_sessions.py +380 -0
  63. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_capability.py +174 -0
  64. spaps-0.8.3/tests/unit/test_cfo.py +321 -0
  65. spaps-0.8.3/tests/unit/test_cfo_actions.py +171 -0
  66. spaps-0.8.3/tests/unit/test_cfo_async.py +104 -0
  67. spaps-0.8.3/tests/unit/test_cfo_browser_session.py +669 -0
  68. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_client.py +30 -1
  69. spaps-0.8.3/tests/unit/test_crypto_invoice_flags.py +43 -0
  70. spaps-0.8.3/tests/unit/test_dashboard.py +221 -0
  71. spaps-0.8.3/tests/unit/test_dashboard_authentication.py +167 -0
  72. spaps-0.8.3/tests/unit/test_dashboard_billing.py +64 -0
  73. spaps-0.8.3/tests/unit/test_dashboard_communications.py +39 -0
  74. spaps-0.8.3/tests/unit/test_dashboard_entitlement_options.py +38 -0
  75. spaps-0.8.3/tests/unit/test_dashboard_management_routes.py +58 -0
  76. spaps-0.8.3/tests/unit/test_dashboard_onboarding.py +312 -0
  77. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_dayrate.py +46 -1
  78. spaps-0.8.3/tests/unit/test_dev_portal.py +480 -0
  79. spaps-0.8.3/tests/unit/test_dev_portal_async.py +313 -0
  80. spaps-0.8.3/tests/unit/test_developer_projects.py +446 -0
  81. spaps-0.8.3/tests/unit/test_device_flow.py +936 -0
  82. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_email.py +26 -0
  83. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_entitlements.py +121 -0
  84. spaps-0.8.3/tests/unit/test_http.py +357 -0
  85. spaps-0.8.3/tests/unit/test_metadata.py +67 -0
  86. spaps-0.8.3/tests/unit/test_passkey_parity.py +620 -0
  87. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_payments.py +49 -4
  88. spaps-0.8.3/tests/unit/test_prepared_checkout.py +99 -0
  89. spaps-0.8.3/tests/unit/test_purchase_journeys.py +442 -0
  90. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_quickstart_full_adoption_async.py +5 -2
  91. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_readme_snippets.py +39 -1
  92. spaps-0.8.3/tests/unit/test_recovery_landing_profile.py +149 -0
  93. spaps-0.8.3/tests/unit/test_recovery_mfa.py +325 -0
  94. spaps-0.8.3/tests/unit/test_secure_messages.py +787 -0
  95. spaps-0.8.3/tests/unit/test_session_context_capabilities.py +40 -0
  96. spaps-0.8.3/tests/unit/test_sessions.py +559 -0
  97. spaps-0.8.3/tests/unit/test_staged_passkey_bootstrap.py +365 -0
  98. spaps-0.8.3/tests/unit/test_storage.py +373 -0
  99. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_support_telemetry.py +67 -0
  100. spaps-0.8.3/tests/unit/test_token_gates.py +492 -0
  101. spaps-0.8.3/tests/unit/test_token_gates_docs_snippets.py +61 -0
  102. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_users.py +107 -5
  103. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_users_async.py +82 -0
  104. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_webhooks.py +20 -0
  105. spaps-0.8.3/tests/unit/test_whitelist.py +522 -0
  106. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_x402.py +47 -0
  107. spaps-0.6.2/CHANGELOG.md +0 -137
  108. spaps-0.6.2/LICENSE +0 -22
  109. spaps-0.6.2/src/spaps_client/auth.py +0 -1008
  110. spaps-0.6.2/src/spaps_client/auth_async.py +0 -650
  111. spaps-0.6.2/src/spaps_client/http.py +0 -174
  112. spaps-0.6.2/src/spaps_client/http_async.py +0 -87
  113. spaps-0.6.2/src/spaps_client/secure_messages.py +0 -172
  114. spaps-0.6.2/src/spaps_client/secure_messages_async.py +0 -105
  115. spaps-0.6.2/src/spaps_client/storage.py +0 -181
  116. spaps-0.6.2/tests/unit/test_device_flow.py +0 -430
  117. spaps-0.6.2/tests/unit/test_http.py +0 -116
  118. spaps-0.6.2/tests/unit/test_metadata.py +0 -32
  119. spaps-0.6.2/tests/unit/test_secure_messages.py +0 -127
  120. spaps-0.6.2/tests/unit/test_sessions.py +0 -281
  121. spaps-0.6.2/tests/unit/test_storage.py +0 -110
  122. spaps-0.6.2/tests/unit/test_whitelist.py +0 -172
  123. {spaps-0.6.2 → spaps-0.8.3}/FULL_CHECKLIST.md +0 -0
  124. {spaps-0.6.2 → spaps-0.8.3}/TODO.md +0 -0
  125. {spaps-0.6.2 → spaps-0.8.3}/docs/RELEASE_CHECKLIST.md +0 -0
  126. {spaps-0.6.2 → spaps-0.8.3}/scripts/manage_version.py +0 -0
  127. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/config.py +0 -0
  128. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/issue_reporting.py +0 -0
  129. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/issue_reporting_async.py +0 -0
  130. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/marketing.py +0 -0
  131. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/metrics.py +0 -0
  132. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/metrics_async.py +0 -0
  133. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/permissions.py +0 -0
  134. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/py.typed +0 -0
  135. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/skill_evals.py +0 -0
  136. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/skill_evals_async.py +0 -0
  137. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/usage.py +0 -0
  138. {spaps-0.6.2 → spaps-0.8.3}/src/spaps_client/usage_async.py +0 -0
  139. {spaps-0.6.2 → spaps-0.8.3}/tests/conftest.py +0 -0
  140. {spaps-0.6.2 → spaps-0.8.3}/tests/integration/test_build.py +0 -0
  141. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_config.py +0 -0
  142. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_issue_reporting.py +0 -0
  143. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_marketing.py +0 -0
  144. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_metrics.py +0 -0
  145. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_permissions.py +0 -0
  146. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_skill_evals.py +0 -0
  147. {spaps-0.6.2 → spaps-0.8.3}/tests/unit/test_usage.py +0 -0
@@ -1,5 +1,5 @@
1
1
  # Dependencies
2
- node_modules/
2
+ node_modules
3
3
  *.log
4
4
  npm-debug.log*
5
5
  yarn-debug.log*
@@ -13,7 +13,7 @@ sweet-potato-threat-model.md
13
13
  *.py[cod]
14
14
  *.pyo
15
15
  *.pyd
16
- .venv/
16
+ .venv
17
17
  *.egg-info/
18
18
 
19
19
  # Testing
@@ -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/
@@ -165,6 +166,8 @@ backup-feb8.sql
165
166
  .ntm/
166
167
  .skillbox/
167
168
  artifacts/openapi-contract/
169
+ # Local-only secret inventory; canonical is docs/security/SECRET_EXPOSURE_REPORT.md
170
+ artifacts/SECRET_EXPOSURE_REPORT.md
168
171
  MODES_ANALYSIS_PROGRESS.md
169
172
  MODES_OF_REASONING_REPORT_AND_ANALYSIS_OF_PROJECT.md
170
173
  MODE_OUTPUT_*.md
@@ -204,3 +207,30 @@ refactor/
204
207
 
205
208
  # Beads compliance audit dir (managed by /beads-compliance-and-completion-verification skill)
206
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,260 @@
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.3] - 2026-10-24
12
+
13
+ **Unpublished source candidate.** This date records candidate preparation, not
14
+ registry publication or downstream deployment.
15
+
16
+ - Prepare the `0.8.3.dev0` checkout as `0.8.3` alongside server `0.9.1`
17
+ ([54a0059a](https://github.com/build000r/sweet-potato/commit/54a0059aba568f750da284496c4863a0db695cf4)).
18
+ - Include sync/async purchase-journey and developer-portal helpers, scoped
19
+ dashboard controls, capability decisions, and authenticated CFO action-journey
20
+ helpers added since the retained public `0.8.2` baseline.
21
+
22
+ ## [0.8.3.dev0] - 2026-10-22
23
+
24
+ **Unpublished development checkout.**
25
+
26
+ - Separate the expanded checkout API from the public `0.8.2` artifact observed
27
+ on 2026-10-22. The offline surface guard rejects different APIs using the same
28
+ version and validates retained artifact provenance before comparing them.
29
+
30
+ ## [0.8.2] - 2026-10-01
31
+
32
+ **Public artifact observed 2026-10-22.** This heading originally described a
33
+ source candidate. Registry observation does not establish its publication date.
34
+ The original candidate superseded tagged but unpublished `0.8.1`.
35
+
36
+ - Repack the reviewed source cohort with corrected exact-artifact inspection; no Python client API change.
37
+
38
+ ## [0.8.1] - 2026-09-30
39
+
40
+ **Unpublished source candidate.** Supersedes the tagged but unpublished
41
+ `0.8.0` candidate in the coordinated package release.
42
+
43
+ ## [0.8.0] - 2026-09-30
44
+
45
+ **Unpublished source candidate.** This version has not passed the coordinated
46
+ package review or been published. The last published version is `0.6.2`;
47
+ `0.8.0` also includes the changes recorded under the unpublished `0.7.x`
48
+ checkpoints below.
49
+
50
+ This candidate includes the source changes after the `0.7.2` checkpoint.
51
+ The pair-scoped secure-message API and removal of offset paging are breaking
52
+ changes; migrate callers before upgrading.
53
+
54
+ ### Added
55
+
56
+ - Added the secure-message **authorship contract** (server revision `000000000094`) to the sync
57
+ `SecureMessagesClient` and async `AsyncSecureMessagesClient`: responses now carry
58
+ `sender_user_id`, `sender_role`, and `client_message_id`, and `SecureMessage.has_known_sender`
59
+ is the branch point for messages written before that revision, whose authorship is genuinely
60
+ unknown and is never back-filled from `patient_id` / `practitioner_id`.
61
+ - Added idempotent sends via `create_message(..., client_message_id=...)`. The token is bounded to
62
+ 1-200 characters locally, mirroring the server `CHECK` constraint
63
+ `ck_secure_messages_client_message_id_len`, so an oversized token is a `ValueError` instead of a
64
+ round trip that ends in a 400. Retrying with the same token, as the same authenticated sender and
65
+ with the same pair/content/metadata, returns the original message; reusing it for a different
66
+ message is `409 SECURE_MESSAGES_IDEMPOTENCY_CONFLICT`.
67
+ - Added `iter_messages(patient_id=..., practitioner_id=...)` on both surfaces, which follows the
68
+ keyset `next_cursor` to the end of one conversation.
69
+ - Exported `SENDER_ROLE_PATIENT`, `SENDER_ROLE_PRACTITIONER`, `MIN_CLIENT_MESSAGE_ID_LENGTH`,
70
+ `MAX_CLIENT_MESSAGE_ID_LENGTH` from `spaps_client`, and `FORBIDDEN_SENDER_KEYS` plus the
71
+ `SECURE_MESSAGES_*` error codes from `spaps_client.secure_messages`, so consumers branch on the
72
+ server vocabulary instead of hand-copied strings.
73
+
74
+ ### Changed
75
+
76
+ - **BREAKING.** `GET /api/secure-messages` is now pair-scoped. `list_messages` and `iter_messages`
77
+ take `patient_id` and `practitioner_id` as required keyword arguments on both the sync and async
78
+ surfaces; there is no "all my messages" read. An empty id raises `ValueError` locally rather than
79
+ issuing a request the server will reject.
80
+ - **BREAKING.** `offset` paging is gone. The server answers a non-zero `offset` with
81
+ `400 SECURE_MESSAGES_OFFSET_UNSUPPORTED` because offset paging over an append-only conversation
82
+ drops or repeats messages, so the clients have no `offset` parameter at all and never emit the
83
+ query key. Replace any offset loop with `iter_messages(...)` or a manual `cursor` loop.
84
+ - The message author is derived server-side from the authenticated JWT and can never be supplied by
85
+ a caller. Neither `create_message` accepts a sender argument in any spelling, and
86
+ `FORBIDDEN_SENDER_KEYS` (`senderUserId`, `sender_user_id`, `senderRole`, `sender_role`) is
87
+ asserted absent from every outgoing body before the request is built.
88
+ - The async client delegates to the same `build_create_payload` / `build_list_params` / `build_page`
89
+ helpers as the sync client, so the two surfaces cannot drift on which keys they send.
90
+
91
+ ### Fixed
92
+
93
+ - Local `0.7.2` candidate: accept explicit `wallets: null` as an empty wallet list when public
94
+ sync and async auth clients decode user profiles, while retaining validation for malformed
95
+ non-null wallet values.
96
+
97
+ ## [0.7.2] - 2026-09-14
98
+
99
+ **Unreleased source checkpoint.** This date records source commit
100
+ `c52a7b0d82e5991f3abd807f5ccf5949af81c651`, not package publication.
101
+ The Unreleased entries above remain pending; this checkpoint does not
102
+ assign them to a release.
103
+
104
+ ### Fixed
105
+
106
+ - Accept explicit `wallets: null` as an empty wallet list when sync and
107
+ async auth clients decode user profiles. Malformed non-null values
108
+ still fail validation.
109
+
110
+ ## [0.7.1] - 2026-07-28
111
+
112
+ ### Fixed
113
+
114
+ - Excluded generated coverage databases from source distributions and made the
115
+ release inspector reject build-host coverage material.
116
+ - Pinned the release-gate Ruff version and made package timestamps derive from
117
+ the exact source commit.
118
+ - Superseded the quarantined unpublished `0.7.0` manifest; its wheel and sdist
119
+ remain rejected audit history.
120
+
121
+ ## [0.7.0] - 2026-07-15
122
+
123
+ ### Added
124
+
125
+ - 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.
126
+ - Added explicit WebAuthn `Origin` forwarding, exact public/user/admin authentication behavior, typed recovery grant rotation, and token storage only for token-issuing passkey responses.
127
+
128
+ ### Fixed
129
+
130
+ - Preserved passkey API error details and top-level request IDs in `AuthError`, while keeping response-header request IDs authoritative.
131
+
132
+ ## [0.6.2] - 2026-06-16
133
+
134
+ ### Fixed
135
+
136
+ - 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.
137
+
138
+ ### Changed
139
+
140
+ - Bumped the Python client package metadata to `0.6.2`.
141
+
142
+ ## [0.6.1] - 2026-06-14
143
+
144
+ ### Added
145
+
146
+ - Added sync `DayrateClient` helpers and sync/async `AppLinksClient` helpers, with high-level `SpapsClient.dayrate`, `SpapsClient.app_links`, and `AsyncSpapsClient.app_links` accessors.
147
+ - Added sync and async `UsersClient.memberships` helpers for listing, inviting/adding, and removing app account users.
148
+ - Added sync and async `EntitlementsClient.project_grants` helpers for granting, revoking, listing, checking, and claiming project access grants.
149
+
150
+ ### Fixed
151
+
152
+ - 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`.
153
+ - Exposed omitted password reset request messages as `None` instead of an empty string placeholder so apps keep ownership of success copy.
154
+ - Preserved password reset confirmation parsing for canonical envelopes where the success copy lives at `data.message`.
155
+
156
+ ### Changed
157
+
158
+ - 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.
159
+
160
+ ## [0.6.0] - 2026-06-13
161
+
162
+ ### Added
163
+
164
+ - 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.
165
+ - Added typed MFA challenge responses so token-issuing auth methods can return either tokens or an MFA challenge without storing incomplete credentials.
166
+
167
+ ### Changed
168
+
169
+ - Bumped the Python client package metadata to `0.6.0`.
170
+
171
+ ## [0.5.1] - 2026-06-04
172
+
173
+ ### Added
174
+
175
+ - Added sync and async issue-reporting screenshot attachment helpers for private upload, list, access URL, delete, and attach-by-ID create/update/reply flows.
176
+
177
+ ## [0.5.0] - 2026-03-29
178
+
179
+ ### Added
180
+
181
+ - End-user issue-report flows across the Python client surface.
182
+ - Support-telemetry helpers aligned with the current SPAPS platform APIs.
183
+
184
+ ### Changed
185
+
186
+ - Refreshed package docs and OSS-facing references for the published client surface.
187
+
188
+ ## [0.4.1] - 2026-02-18
189
+
190
+ ### Changed
191
+
192
+ - Relaxed required fields in email and entitlement schemas for forward compatibility.
193
+ - Relaxed `Entitlement.source` from `Literal` to `str` to accept newly introduced source types without forcing immediate client upgrades.
194
+
195
+ ## [0.4.0] - 2026-02-17
196
+
197
+ ### Added
198
+
199
+ - `UsersClient` and `AsyncUsersClient` for user management operations.
200
+ - Async quickstart parity wrappers aligned with server-side helpers.
201
+ - Referral fields in registration flow.
202
+
203
+ ## [0.3.0] - 2026-02-11
204
+
205
+ ### Changed
206
+
207
+ - Consolidated SPAPS integration patterns into published packages.
208
+ - Aligned Python client surface area with production SPAPS APIs.
209
+
210
+ ## [0.2.0] - 2025-12-30
211
+
212
+ ### Added
213
+
214
+ - Broader SDK coverage to support production cutover requirements.
215
+ - Email-service and set-password endpoint client stubs.
216
+
217
+ ### Changed
218
+
219
+ - Standardized configuration defaults (including port `3301` and environment symlink conventions).
220
+
221
+ ## [0.1.4] - 2025-11-09
222
+
223
+ ### Fixed
224
+
225
+ - Session validation response parsing for the `valid` field contract.
226
+
227
+ ## [0.1.3] - 2025-10-14
228
+
229
+ ### Added
230
+
231
+ - Subscription list/detail/cancel/swap helpers to match TypeScript SDK behavior.
232
+ - Checkout session lookup/list/expire and guest checkout lifecycle helpers.
233
+ - Stripe payment history summaries and payment-detail retrieval.
234
+ - Client-side role/permission utilities in `spaps_client.permissions`.
235
+
236
+ ### Changed
237
+
238
+ - Refreshed README examples for newly added helpers.
239
+
240
+ ## [0.1.2] - 2025-10-12
241
+
242
+ ### Changed
243
+
244
+ - Standardized crypto invoice lookup helper behavior and logging paths.
245
+
246
+ ## [0.1.1] - 2025-10-11
247
+
248
+ ### Changed
249
+
250
+ - Widened `httpx` dependency range to `<0.29` for FastAPI default-stack compatibility (`0.28.x`).
251
+
252
+ ## [0.1.0] - 2025-10-11
253
+
254
+ ### Added
255
+
256
+ - Initial public PyPI release under the `spaps` distribution name.
257
+ - Sync and async clients for sessions, payments (including crypto), usage, whitelist, secure messages, and metrics.
258
+ - Configurable retry/backoff behavior, logging hooks, and token storage abstractions.
259
+ - Linting/type-checking/coverage gates integrated with the release workflow.
260
+ - Python quickstart documentation and backend integration guide.
spaps-0.8.3/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.