authsome 0.4.2__tar.gz → 0.5.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.
Files changed (372) hide show
  1. authsome-0.5.0/.github/release-please-manifest.json +3 -0
  2. authsome-0.5.0/.gitleaksignore +2 -0
  3. {authsome-0.4.2 → authsome-0.5.0}/CHANGELOG.md +55 -0
  4. {authsome-0.4.2 → authsome-0.5.0}/CONTEXT.md +26 -12
  5. {authsome-0.4.2 → authsome-0.5.0}/PKG-INFO +7 -1
  6. authsome-0.5.0/docs/adr/0005-audit-otel-sqlite.md +22 -0
  7. authsome-0.5.0/docs/adr/0006-principal-roles-admin-user.md +18 -0
  8. authsome-0.5.0/docs/adr/0007-unified-deployment-flow.md +36 -0
  9. authsome-0.5.0/docs/internal/manual-testing.md +435 -0
  10. authsome-0.5.0/docs/refactor.md +336 -0
  11. {authsome-0.4.2 → authsome-0.5.0}/docs/site/roadmap.mdx +9 -4
  12. {authsome-0.4.2 → authsome-0.5.0}/pyproject.toml +7 -1
  13. authsome-0.5.0/src/authsome/audit/__init__.py +74 -0
  14. authsome-0.5.0/src/authsome/auth/browser_cookies.py +59 -0
  15. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/github.json +5 -2
  16. authsome-0.5.0/src/authsome/auth/bundled_providers/linkedin-browser.json +25 -0
  17. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/openai.json +1 -0
  18. authsome-0.5.0/src/authsome/auth/bundled_providers/x-browser.json +28 -0
  19. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/__init__.py +3 -2
  20. authsome-0.5.0/src/authsome/auth/flows/browser.py +184 -0
  21. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/__init__.py +1 -2
  22. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/config.py +0 -8
  23. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/connection.py +3 -0
  24. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/enums.py +2 -0
  25. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/provider.py +42 -2
  26. authsome-0.5.0/src/authsome/auth/utils.py +164 -0
  27. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/client.py +27 -10
  28. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/daemon_control.py +18 -11
  29. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/helpers.py +3 -1
  30. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/main.py +174 -4
  31. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/__init__.py +0 -4
  32. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/local.py +1 -0
  33. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/principal.py +9 -22
  34. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/runner.py +2 -0
  35. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/server.py +72 -30
  36. authsome-0.4.2/src/authsome/server/hosted_auth.py → authsome-0.5.0/src/authsome/server/account_auth.py +13 -13
  37. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/analytics.py +1 -1
  38. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/app.py +21 -27
  39. authsome-0.5.0/src/authsome/server/credential_repository.py +248 -0
  40. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/credential_service.py +158 -334
  41. authsome-0.5.0/src/authsome/server/dependencies.py +162 -0
  42. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/identity_bootstrap.py +21 -39
  43. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/ownership.py +24 -49
  44. authsome-0.5.0/src/authsome/server/provider_repository.py +67 -0
  45. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/proxy_catalog.py +22 -4
  46. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/_deps.py +51 -22
  47. authsome-0.5.0/src/authsome/server/routes/audit.py +40 -0
  48. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/auth.py +16 -7
  49. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/connections.py +3 -3
  50. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/health.py +16 -13
  51. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/identities.py +1 -1
  52. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/providers.py +3 -3
  53. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/ui.py +168 -90
  54. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/schemas.py +32 -2
  55. authsome-0.5.0/src/authsome/server/secrets.py +120 -0
  56. authsome-0.5.0/src/authsome/server/store/__init__.py +6 -0
  57. authsome-0.5.0/src/authsome/server/store/database.py +237 -0
  58. authsome-0.5.0/src/authsome/server/store/repositories.py +677 -0
  59. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/ui_sessions.py +11 -11
  60. authsome-0.5.0/src/authsome/server/web_pages/__init__.py +7 -0
  61. {authsome-0.4.2/src/authsome/server/ui → authsome-0.5.0/src/authsome/server/web_pages}/pages.py +13 -13
  62. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/static/app.js +1 -1
  63. authsome-0.5.0/src/authsome/ui/static/style.css +1130 -0
  64. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/_app_detail_shell.html +1 -1
  65. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/_layout.html +22 -11
  66. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_apikey.html +1 -1
  67. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_disconnected.html +2 -2
  68. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_managed.html +4 -3
  69. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_oauth.html +2 -2
  70. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_provider.html +3 -3
  71. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/applications.html +19 -3
  72. authsome-0.5.0/src/authsome/ui/templates/audit.html +71 -0
  73. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/connections.html +3 -2
  74. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/identity.html +10 -3
  75. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/overview.html +16 -17
  76. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/utils.py +1 -129
  77. authsome-0.5.0/src/authsome/vault/__init__.py +85 -0
  78. authsome-0.5.0/src/authsome/vault/crypto.py +143 -0
  79. authsome-0.5.0/tests/auth/test_browser_cookies.py +99 -0
  80. authsome-0.5.0/tests/auth/test_browser_flow.py +196 -0
  81. authsome-0.5.0/tests/auth/test_browser_service.py +171 -0
  82. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_models.py +2 -2
  83. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_service.py +71 -21
  84. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_service_provider_clients.py +67 -38
  85. authsome-0.5.0/tests/auth/test_service_provider_definitions.py +77 -0
  86. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_daemon.py +21 -21
  87. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_init.py +0 -5
  88. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_revoke.py +1 -1
  89. authsome-0.5.0/tests/common/test_utils.py +46 -0
  90. authsome-0.5.0/tests/identity/test_registry.py +52 -0
  91. {authsome-0.4.2 → authsome-0.5.0}/tests/proxy/test_proxy.py +44 -32
  92. authsome-0.5.0/tests/server/test_account_auth.py +99 -0
  93. authsome-0.5.0/tests/server/test_audit_events.py +97 -0
  94. {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_auth_sessions.py +3 -10
  95. authsome-0.5.0/tests/server/test_credential_repository.py +144 -0
  96. authsome-0.5.0/tests/server/test_identity_bootstrap.py +56 -0
  97. authsome-0.5.0/tests/server/test_ownership.py +63 -0
  98. {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_pop_auth.py +38 -31
  99. {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_provider_operation_policy.py +47 -20
  100. authsome-0.5.0/tests/server/test_provider_repository.py +82 -0
  101. {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_ui_dashboard.py +93 -61
  102. {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_ui_sessions.py +39 -52
  103. authsome-0.5.0/tests/test_import_boundaries.py +48 -0
  104. authsome-0.5.0/tests/vault/test_crypto.py +115 -0
  105. {authsome-0.4.2 → authsome-0.5.0}/uv.lock +341 -1
  106. authsome-0.4.2/.github/release-please-manifest.json +0 -3
  107. authsome-0.4.2/TODOS.md +0 -274
  108. authsome-0.4.2/docs/internal/manual-testing.md +0 -429
  109. authsome-0.4.2/docs/refactor.md +0 -503
  110. authsome-0.4.2/src/authsome/audit/__init__.py +0 -85
  111. authsome-0.4.2/src/authsome/auth/utils.py +0 -55
  112. authsome-0.4.2/src/authsome/cli/admin.py +0 -193
  113. authsome-0.4.2/src/authsome/server/dependencies.py +0 -238
  114. authsome-0.4.2/src/authsome/server/registries.py +0 -266
  115. authsome-0.4.2/src/authsome/server/ui/__init__.py +0 -1
  116. authsome-0.4.2/src/authsome/store/__init__.py +0 -5
  117. authsome-0.4.2/src/authsome/store/interfaces.py +0 -47
  118. authsome-0.4.2/src/authsome/store/local.py +0 -54
  119. authsome-0.4.2/src/authsome/ui/static/style.css +0 -717
  120. authsome-0.4.2/src/authsome/vault/__init__.py +0 -123
  121. authsome-0.4.2/src/authsome/vault/crypto.py +0 -273
  122. authsome-0.4.2/tests/common/test_audit.py +0 -28
  123. authsome-0.4.2/tests/common/test_utils.py +0 -101
  124. authsome-0.4.2/tests/identity/test_registry.py +0 -41
  125. authsome-0.4.2/tests/server/test_analytics.py +0 -43
  126. authsome-0.4.2/tests/server/test_hosted_auth.py +0 -83
  127. authsome-0.4.2/tests/server/test_identity_bootstrap.py +0 -66
  128. authsome-0.4.2/tests/server/test_ownership.py +0 -63
  129. authsome-0.4.2/tests/vault/test_crypto.py +0 -312
  130. {authsome-0.4.2 → authsome-0.5.0}/.claude/commands/run-evals.md +0 -0
  131. {authsome-0.4.2 → authsome-0.5.0}/.claude-plugin/marketplace.json +0 -0
  132. {authsome-0.4.2 → authsome-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  133. {authsome-0.4.2 → authsome-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  134. {authsome-0.4.2 → authsome-0.5.0}/.github/dependabot.yml +0 -0
  135. {authsome-0.4.2 → authsome-0.5.0}/.github/pull_request_template.md +0 -0
  136. {authsome-0.4.2 → authsome-0.5.0}/.github/release-please-config.json +0 -0
  137. {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/pr-title.yml +0 -0
  138. {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/publish-rc.yml +0 -0
  139. {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/publish.yml +0 -0
  140. {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/release-please.yml +0 -0
  141. {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/test.yml +0 -0
  142. {authsome-0.4.2 → authsome-0.5.0}/.gitignore +0 -0
  143. {authsome-0.4.2 → authsome-0.5.0}/.pre-commit-config.yaml +0 -0
  144. {authsome-0.4.2 → authsome-0.5.0}/AGENTS.md +0 -0
  145. {authsome-0.4.2 → authsome-0.5.0}/CLAUDE.md +0 -0
  146. {authsome-0.4.2 → authsome-0.5.0}/CONTRIBUTING.md +0 -0
  147. {authsome-0.4.2 → authsome-0.5.0}/LICENSE +0 -0
  148. {authsome-0.4.2 → authsome-0.5.0}/README.md +0 -0
  149. {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-how-it-works-dark.svg +0 -0
  150. {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-how-it-works-light.svg +0 -0
  151. {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-logo-dark.svg +0 -0
  152. {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-logo-light.svg +0 -0
  153. {authsome-0.4.2 → authsome-0.5.0}/docs/UBIQUITOUS_LANGUAGE.md +0 -0
  154. {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
  155. {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0002-server-registered-identities.md +0 -0
  156. {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0003-principal-owned-vault.md +0 -0
  157. /authsome-0.4.2/docs/adr/0003-proxy-unmatched-pass-through.md → /authsome-0.5.0/docs/adr/0004-proxy-unmatched-pass-through.md +0 -0
  158. {authsome-0.4.2 → authsome-0.5.0}/docs/agents/domain.md +0 -0
  159. {authsome-0.4.2 → authsome-0.5.0}/docs/agents/issue-tracker.md +0 -0
  160. {authsome-0.4.2 → authsome-0.5.0}/docs/agents/triage-labels.md +0 -0
  161. {authsome-0.4.2 → authsome-0.5.0}/docs/internal/authsome-design.md +0 -0
  162. {authsome-0.4.2 → authsome-0.5.0}/docs/internal/cli-design-review.md +0 -0
  163. {authsome-0.4.2 → authsome-0.5.0}/docs/register-provider.md +0 -0
  164. {authsome-0.4.2 → authsome-0.5.0}/docs/site/README.md +0 -0
  165. {authsome-0.4.2 → authsome-0.5.0}/docs/site/changelog.mdx +0 -0
  166. {authsome-0.4.2 → authsome-0.5.0}/docs/site/compared.mdx +0 -0
  167. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/architecture.mdx +0 -0
  168. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/credential-storage.mdx +0 -0
  169. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/profiles-vs-connections.mdx +0 -0
  170. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/provider-registry.mdx +0 -0
  171. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/proxy-injection.mdx +0 -0
  172. {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/the-daemon.mdx +0 -0
  173. {authsome-0.4.2 → authsome-0.5.0}/docs/site/docs.json +0 -0
  174. {authsome-0.4.2 → authsome-0.5.0}/docs/site/favicon.svg +0 -0
  175. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/custom-providers.mdx +0 -0
  176. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/headless-device-code.mdx +0 -0
  177. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/login-with-oauth.mdx +0 -0
  178. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/multiple-connections.mdx +0 -0
  179. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/profiles.mdx +0 -0
  180. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
  181. {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/use-api-keys.mdx +0 -0
  182. {authsome-0.4.2 → authsome-0.5.0}/docs/site/images/login-github-authsome.png +0 -0
  183. {authsome-0.4.2 → authsome-0.5.0}/docs/site/index.mdx +0 -0
  184. {authsome-0.4.2 → authsome-0.5.0}/docs/site/installation.mdx +0 -0
  185. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/anthropic-sdk.mdx +0 -0
  186. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/claude-code.mdx +0 -0
  187. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/codex.mdx +0 -0
  188. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/cowork.mdx +0 -0
  189. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/cursor.mdx +0 -0
  190. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/hermes.mdx +0 -0
  191. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/index.mdx +0 -0
  192. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/langchain.mdx +0 -0
  193. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/llamaindex.mdx +0 -0
  194. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/nanoclaw.mdx +0 -0
  195. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/openai-agents-sdk.mdx +0 -0
  196. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/opencode.mdx +0 -0
  197. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/python.mdx +0 -0
  198. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/ahrefs.mdx +0 -0
  199. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/apollo.mdx +0 -0
  200. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/ashby.mdx +0 -0
  201. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/beehiiv.mdx +0 -0
  202. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/brevo.mdx +0 -0
  203. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/buffer.mdx +0 -0
  204. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/calendly.mdx +0 -0
  205. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/clearbit.mdx +0 -0
  206. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/dub.mdx +0 -0
  207. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/g2.mdx +0 -0
  208. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/hunter.mdx +0 -0
  209. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/index.mdx +0 -0
  210. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/instantly.mdx +0 -0
  211. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/intercom.mdx +0 -0
  212. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/keywords-everywhere.mdx +0 -0
  213. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/klaviyo.mdx +0 -0
  214. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/lemlist.mdx +0 -0
  215. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/livestorm.mdx +0 -0
  216. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/mailchimp.mdx +0 -0
  217. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/mention-me.mdx +0 -0
  218. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/openai.mdx +0 -0
  219. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/optimizely.mdx +0 -0
  220. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/postmark.mdx +0 -0
  221. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/resend.mdx +0 -0
  222. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/rewardful.mdx +0 -0
  223. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/savvycal.mdx +0 -0
  224. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/semrush.mdx +0 -0
  225. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/sendgrid.mdx +0 -0
  226. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/tolt.mdx +0 -0
  227. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/typeform.mdx +0 -0
  228. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/wistia.mdx +0 -0
  229. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/zapier.mdx +0 -0
  230. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/atlassian.mdx +0 -0
  231. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/discord.mdx +0 -0
  232. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/github.mdx +0 -0
  233. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/gitlab.mdx +0 -0
  234. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/google.mdx +0 -0
  235. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/hubspot.mdx +0 -0
  236. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/index.mdx +0 -0
  237. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/klaviyo-oauth.mdx +0 -0
  238. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/linear.mdx +0 -0
  239. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/microsoft.mdx +0 -0
  240. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/notion-dcr.mdx +0 -0
  241. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/notion.mdx +0 -0
  242. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/postiz.mdx +0 -0
  243. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/slack.mdx +0 -0
  244. {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/x.mdx +0 -0
  245. {authsome-0.4.2 → authsome-0.5.0}/docs/site/logo/dark.svg +0 -0
  246. {authsome-0.4.2 → authsome-0.5.0}/docs/site/logo/light.svg +0 -0
  247. {authsome-0.4.2 → authsome-0.5.0}/docs/site/quickstart.mdx +0 -0
  248. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/audit-log.mdx +0 -0
  249. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/bundled-providers.mdx +0 -0
  250. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/cli.mdx +0 -0
  251. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/daemon-api.mdx +0 -0
  252. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/environment-variables.mdx +0 -0
  253. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/file-layout.mdx +0 -0
  254. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/provider-schema.mdx +0 -0
  255. {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/python-library.mdx +0 -0
  256. {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/daemon-trust-boundary.mdx +0 -0
  257. {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/disclosure.mdx +0 -0
  258. {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/encryption.mdx +0 -0
  259. {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/hosted-deployment.mdx +0 -0
  260. {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/threat-model.mdx +0 -0
  261. {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/masked-input-note.mdx +0 -0
  262. {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/multi-connections-cta.mdx +0 -0
  263. {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/whats-next-apikey.mdx +0 -0
  264. {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/whats-next-oauth.mdx +0 -0
  265. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/auth-errors.mdx +0 -0
  266. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/daemon-issues.mdx +0 -0
  267. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/doctor.mdx +0 -0
  268. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
  269. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
  270. {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/token-refresh.mdx +0 -0
  271. {authsome-0.4.2 → authsome-0.5.0}/evals/.gitignore +0 -0
  272. {authsome-0.4.2 → authsome-0.5.0}/evals/evals.json +0 -0
  273. {authsome-0.4.2 → authsome-0.5.0}/evals/generate_report.py +0 -0
  274. {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/SKILL.md +0 -0
  275. {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/references/adding-provider.md +0 -0
  276. {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/references/feedback.md +0 -0
  277. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/__init__.py +0 -0
  278. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/__init__.py +0 -0
  279. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/__init__.py +0 -0
  280. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
  281. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/apollo.json +0 -0
  282. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/ashby.json +0 -0
  283. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
  284. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
  285. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/brevo.json +0 -0
  286. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/buffer.json +0 -0
  287. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/calendly.json +0 -0
  288. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
  289. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/discord.json +0 -0
  290. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/dub.json +0 -0
  291. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/g2.json +0 -0
  292. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
  293. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/google.json +0 -0
  294. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
  295. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/hunter.json +0 -0
  296. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/instantly.json +0 -0
  297. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/intercom.json +0 -0
  298. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
  299. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
  300. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
  301. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
  302. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/linear.json +0 -0
  303. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
  304. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
  305. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
  306. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
  307. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/notion.json +0 -0
  308. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
  309. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
  310. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/postiz.json +0 -0
  311. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/postmark.json +0 -0
  312. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/resend.json +0 -0
  313. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
  314. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
  315. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/semrush.json +0 -0
  316. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
  317. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/slack.json +0 -0
  318. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/tolt.json +0 -0
  319. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/typeform.json +0 -0
  320. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/wistia.json +0 -0
  321. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/x.json +0 -0
  322. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/zapier.json +0 -0
  323. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/api_key.py +0 -0
  324. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/base.py +0 -0
  325. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/dcr_pkce.py +0 -0
  326. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/device_code.py +0 -0
  327. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/pkce.py +0 -0
  328. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/input_provider.py +0 -0
  329. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/sessions.py +0 -0
  330. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/__init__.py +0 -0
  331. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/client_config.py +0 -0
  332. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/context.py +0 -0
  333. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/errors.py +0 -0
  334. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/proof.py +0 -0
  335. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/registry.py +0 -0
  336. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/paths.py +0 -0
  337. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/__init__.py +0 -0
  338. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/certs.py +0 -0
  339. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/router.py +0 -0
  340. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/py.typed +0 -0
  341. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/__init__.py +0 -0
  342. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/daemon.py +0 -0
  343. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/__init__.py +0 -0
  344. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/proxy.py +0 -0
  345. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/urls.py +0 -0
  346. {authsome-0.4.2/src/authsome/server/ui → authsome-0.5.0/src/authsome/server/web_pages}/web_theme.py +0 -0
  347. {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/__init__.py +0 -0
  348. {authsome-0.4.2 → authsome-0.5.0}/tests/__init__.py +0 -0
  349. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/__init__.py +0 -0
  350. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_flows.py +0 -0
  351. {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_url_template.py +0 -0
  352. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/__init__.py +0 -0
  353. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/conftest.py +0 -0
  354. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_client_signing.py +0 -0
  355. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_doctor.py +0 -0
  356. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_get.py +0 -0
  357. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_helpers.py +0 -0
  358. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_identity.py +0 -0
  359. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_import_env.py +0 -0
  360. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_list.py +0 -0
  361. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_login.py +0 -0
  362. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_logout.py +0 -0
  363. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_register.py +0 -0
  364. {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_whoami.py +0 -0
  365. {authsome-0.4.2 → authsome-0.5.0}/tests/common/__init__.py +0 -0
  366. {authsome-0.4.2 → authsome-0.5.0}/tests/common/test_errors.py +0 -0
  367. {authsome-0.4.2 → authsome-0.5.0}/tests/common/test_logging.py +0 -0
  368. {authsome-0.4.2 → authsome-0.5.0}/tests/conftest.py +0 -0
  369. {authsome-0.4.2 → authsome-0.5.0}/tests/identity/test_identity.py +0 -0
  370. {authsome-0.4.2 → authsome-0.5.0}/tests/identity/test_proof.py +0 -0
  371. {authsome-0.4.2 → authsome-0.5.0}/tests/proxy/__init__.py +0 -0
  372. {authsome-0.4.2 → authsome-0.5.0}/tests/vault/__init__.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.5.0"
3
+ }
@@ -0,0 +1,2 @@
1
+ # PostHog public project API key — intentionally committed, not a secret
2
+ src/authsome/server/analytics.py:generic-api-key:50
@@ -1,5 +1,60 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.0](https://github.com/agentrhq/authsome/compare/authsome-v0.4.2...authsome-v0.5.0) (2026-05-29)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * existing local installs have an unclaimed identity under local@authsome.internal and are rejected until the user registers a principal (email+password) and claims the identity.
9
+ * existing Fernet-encrypted vaults cannot be read back; migration requires re-importing credentials.
10
+ * mount dashboard at / instead of /ui
11
+
12
+ ### Features
13
+
14
+ * add admin audit dashboard ([1bc5044](https://github.com/agentrhq/authsome/commit/1bc504472ace6629e88a9ad06531c927ff31da26))
15
+ * add Anthropic and Gemini bundled providers ([1e47c48](https://github.com/agentrhq/authsome/commit/1e47c48b07ee76d5a9dfdd58c238150316dca2a0))
16
+ * add Anthropic and Gemini bundled providers ([e788328](https://github.com/agentrhq/authsome/commit/e78832884f69492978a097587374d0e3853371db))
17
+ * add browser SSO via Chrome cookie reading (browser-cookie3) ([aeb4263](https://github.com/agentrhq/authsome/commit/aeb426357f43abe6a13b3684de135c3e6e110166))
18
+ * Add docs for design of principal roles and audit ([de33f8a](https://github.com/agentrhq/authsome/commit/de33f8a5148ff9f6d30e5b392b76e57af751b5ed))
19
+ * add principal_role parameter to AuthService and dependency injection routes ([7d43b56](https://github.com/agentrhq/authsome/commit/7d43b567c8c3e0eec8e4ef33b7fd0eb53cb431b4))
20
+ * browser SSO via Chrome cookie reading (browser-cookie3) ([7607600](https://github.com/agentrhq/authsome/commit/7607600eba2e62125aac801cd09ad28f3948cf3c))
21
+ * implement audit events and principal roles ([9503710](https://github.com/agentrhq/authsome/commit/950371088ba46e5f38086dd0c7fccabd0333f83d))
22
+ * implement audit events and principal roles ([0ed077b](https://github.com/agentrhq/authsome/commit/0ed077b9df60808f840d37460de3a75c5dd8303c))
23
+ * move daemon management commands from admin module to main CLI ([397a8e8](https://github.com/agentrhq/authsome/commit/397a8e8e0aa1142a432ba1af73a3f4235ecccfd9))
24
+ * move daemon management commands from admin module to main CLI ([af356d5](https://github.com/agentrhq/authsome/commit/af356d5f4ff435488484c736516cdad1f61780f4))
25
+ * replace flat master-key vault encryption with Argon2id KEK/DEK model ([b76903d](https://github.com/agentrhq/authsome/commit/b76903d74b61ff469a4221d41e95713a04bdaeb2))
26
+ * respect AUTHSOME_DAEMON_URL in all daemon control paths ([fa23037](https://github.com/agentrhq/authsome/commit/fa23037d73c6c1cc2892654eca6a5d6931f79243))
27
+ * respect AUTHSOME_DAEMON_URL in all daemon control paths ([1ba904b](https://github.com/agentrhq/authsome/commit/1ba904bf0db74fb20e43a370fecf559e97e1f95c))
28
+ * server store refactor ([acb2013](https://github.com/agentrhq/authsome/commit/acb20132f04ef05c81f9d16ce6c2685607ee4171))
29
+
30
+
31
+ ### Bug Fixes
32
+
33
+ * added support for cookie expiry date ([5ea8aa9](https://github.com/agentrhq/authsome/commit/5ea8aa977e8d044420d4f469c047319ed1c3765c))
34
+ * Fix incorrect posthog key and remove unnecessary tests ([77c7bb7](https://github.com/agentrhq/authsome/commit/77c7bb7b24e9bd4f8135685127ff53617e9a73b1))
35
+ * Fix incorrect posthog key and remove unnecessary tests ([8f8d9b9](https://github.com/agentrhq/authsome/commit/8f8d9b9e59f6896dca3f3b6b14d33f363d4738b3))
36
+ * refresh DCR provider client on replace ([9af604d](https://github.com/agentrhq/authsome/commit/9af604d80d023ef0762f5f1c6ae41857302de0de))
37
+ * refresh DCR provider client on replace ([595de28](https://github.com/agentrhq/authsome/commit/595de28f25f5526f63cf6e9136291d86c6972754))
38
+ * remove extraneous admin command argument from daemon subprocess invocation ([2c43de6](https://github.com/agentrhq/authsome/commit/2c43de6449ad38f95bd80c6e6d1901b8526e952c))
39
+ * ruff check ([6dbef78](https://github.com/agentrhq/authsome/commit/6dbef782679cdb82a0735dfd879234316d34efad))
40
+
41
+
42
+ ### Reverts
43
+
44
+ * display input fields for dcr providers ([6c108cb](https://github.com/agentrhq/authsome/commit/6c108cb44f5c63ee0c069f941ff2302e9f7a9ff3))
45
+
46
+
47
+ ### Documentation
48
+
49
+ * correct manual testing guide against the current CLI surface ([0a7c379](https://github.com/agentrhq/authsome/commit/0a7c379c007afe1b01d48341b2df14f199411841))
50
+ * update manual testing guide for the unified claim flow ([70e5539](https://github.com/agentrhq/authsome/commit/70e5539a5924a96b7864862444957dc4e385f49e))
51
+
52
+
53
+ ### Code Refactoring
54
+
55
+ * mount dashboard at / instead of /ui ([f8cf936](https://github.com/agentrhq/authsome/commit/f8cf93663f7a4bc757082155c6f4d6bde51da366))
56
+ * unify local and hosted into a single deployment flow ([63bd4c9](https://github.com/agentrhq/authsome/commit/63bd4c90aa10e31d4b11ad9b190f00f1e1e1a316))
57
+
3
58
  ## [0.4.2](https://github.com/agentrhq/authsome/compare/authsome-v0.4.1...authsome-v0.4.2) (2026-05-25)
4
59
 
5
60
 
@@ -88,18 +88,19 @@ Think of this as the secrets layer. Encrypts and decrypts credential blobs trans
88
88
 
89
89
  ### `audit/` — Structured event recording
90
90
 
91
- Think of this as the append-only ledger. Records who did what and when.
91
+ Think of this as the audit instrumentation layer. Defines what happened; `server/` decides where it goes.
92
92
 
93
93
  **Owns:**
94
- - `AuditEvent` model
95
- - `log()` / `alog()` — append to a structured JSON-lines log file
96
- - `setup()` / `clear()` log file lifecycle (called by server at startup/shutdown)
94
+ - `AuditEvent` domain model — mandatory fields: `identity`, `principal_id`, `provider`, `connection`; optional: `method`, `path`, `status`, `metadata`
95
+ - `log()` / `alog()` — emit an `AuditEvent` as an OTel `LogRecord` via `get_logger_provider()`
96
+ - Translation from `AuditEvent` OTel `LogRecord`
97
97
 
98
98
  **Does not own:**
99
- - Business logic
100
- - Any storage beyond the append-only log file
99
+ - Storage — no file I/O, no database
100
+ - Provider lifecycle (`setup()` / `clear()` removed — owned by `server/`)
101
+ - Knowledge of where events are routed
101
102
 
102
- **Imports nothing from this codebase.** Imported by: `auth/`, `server/`
103
+ **Imports:** `opentelemetry-api` only (no SDK, no storage). **Imports nothing from this codebase.** Imported by: `server/`, `proxy/`
103
104
 
104
105
  ---
105
106
 
@@ -120,6 +121,9 @@ Think of this as the daemon process. Wires identity + auth + vault + audit toget
120
121
  - `server/app.py` — FastAPI application factory and lifespan
121
122
  - `server/routes/` — HTTP API surface
122
123
  - `server/schemas.py` — API response schemas
124
+ - `server/audit_store.py` — `SQLiteLogExporter` (OTel `LogExporter` impl) + `AuditStore` query interface; `LoggerProvider` lifecycle (setup at startup, shutdown at teardown)
125
+ - `server/routes/audit.py` — `GET /audit/events` (filtered, paginated admin read)
126
+ - `POST /audit/events` — ingest endpoint for proxy-side external AuditEvents; server enriches `principal_id` from PoP JWT
123
127
 
124
128
  **All filesystem interaction for server-owned state lives here.** No other module writes to server-owned paths.
125
129
 
@@ -141,6 +145,7 @@ A mitmproxy-based HTTPS proxy. Intercepts outgoing agent requests and injects au
141
145
  - Credential loading (asks the server)
142
146
  - Route catalog construction (asks the server)
143
147
  - Provider definitions
148
+ - Audit storage — ships External AuditEvents to server via `POST /audit/events` (fire-and-forget); does not call `audit.log()` directly
144
149
 
145
150
  **Imported by:** `cli/`
146
151
 
@@ -178,12 +183,15 @@ Click-based CLI and HTTP client. Everything here is a client to the server HTTP
178
183
 
179
184
  **PoP JWT**: Short-lived (60 s) Proof-of-Possession token signed with the Identity's Ed25519 private key. Bound to `htm`, `htu`, `body_sha256`. Sent as `Authorization: PoP <token>`.
180
185
 
181
- **Principal**: Non-cryptographic logical partition (human or team) that owns Vaults. Identified by an opaque **PrincipalId** (e.g., `principal_abc123def456`). Has no cryptographic key.
186
+ **Principal**: Non-cryptographic logical partition (human or team) that owns Vaults. Identified by an opaque **PrincipalId** (e.g., `principal_abc123def456`). Has no cryptographic key. Carries exactly one **PrincipalRole**.
182
187
  _Avoid_: User, account, PrincipalHandle, profile
183
188
 
184
189
  **PrincipalId**: Opaque stable identifier for a Principal. Never the email or handle — those can change; the PrincipalId cannot.
185
190
  _Avoid_: principal_handle, principal_name, username
186
191
 
192
+ **PrincipalRole**: Authorization tier for a Principal. Either `admin` or `user`. The first Principal created on a server is always `admin`; all subsequent Principals are `user`. Stored as a column on the Principal record — not in environment variables or a separate table.
193
+ _Avoid_: permission level, access level, user type
194
+
187
195
  **Vault**: Named credential store owned by exactly one Principal. Identified by an opaque **VaultId** (e.g., `vault_a1b2c3d4e5f6`). All credential store keys are prefixed `vault:<vault_id>:...`.
188
196
  _Avoid_: credential store, token store, secret store, profile store
189
197
 
@@ -192,7 +200,7 @@ _Avoid_: vault_name, vault_handle
192
200
 
193
201
  **VaultHandle**: Human-readable name for a Vault (e.g., `default`). Used in UIs and CLI; the VaultId is authoritative in storage.
194
202
 
195
- **IdentityClaimRecord**: Binding from an Identity (Handle) to a Principal (PrincipalId) with a `ClaimStatus`. Created during `authsome init --email`. Vault access is gated until the claim is accepted.
203
+ **IdentityClaimRecord**: Binding from an Identity (Handle) to a Principal (PrincipalId) with a `ClaimStatus`. Created when an authenticated Principal confirms the browser claim that `authsome init` initiates. Vault access is gated until the claim is accepted.
196
204
  _Avoid_: Claim, IdentityRegistration (as claim), join request
197
205
 
198
206
  **ClaimStatus**: Lifecycle state: `pending` → `accepted` | `rejected`.
@@ -201,9 +209,7 @@ _Avoid_: Claim, IdentityRegistration (as claim), join request
201
209
 
202
210
  ## Initialization & Claim Flow
203
211
 
204
- **Local mode**: `authsome init` creates an Identity, auto-accepts its claim under the implicit local Principal, and creates the default Vault. No email required.
205
-
206
- **Hosted mode**: `authsome init --email manoj@example.com` creates an Identity, creates or finds the Principal by email, and registers an `IdentityClaimRecord` with `claim_status = pending`. A human reviews the claim in the UI and accepts or rejects it. All vault operations return `403` until the claim is accepted.
212
+ There is a single flow for every deployment — no deployment mode (see ADR 0007). `authsome init` creates an Identity and registers it; the daemon returns `registration_status = "claim_required"` with a browser **claim URL**. The user opens the URL and registers (or logs in) with **email + password**: the first Principal created on a server becomes `admin`, all subsequent Principals are `user`. The authenticated Principal then confirms the claim, which binds the Identity to the Principal and creates the Principal's default Vault. Until the claim is `accepted`, all vault operations return `403`. The CLI opens the claim URL automatically and polls for completion (and prints the URL to stderr for headless use).
207
213
 
208
214
  ---
209
215
 
@@ -240,6 +246,14 @@ AuthService does not query registries, does not know about server filesystem pat
240
246
 
241
247
  Every `AuditEvent` carries `identity` (the agent Handle) and `principal_id` (the PrincipalId). Both are required — every auditable action has an acting agent and an owning principal.
242
248
 
249
+ **External AuditEvent**: An event produced by the proxy layer — records an outbound HTTP call an agent made through the proxy to a third-party API (e.g., a call to `api.github.com`). Classified by provider and connection. Mandatory fields: identity, principal_id, provider, connection. Optional fields: HTTP method, path, response status.
250
+ _Avoid_: proxy event, API event, outbound event
251
+
252
+ **Internal AuditEvent**: An event produced by the server layer — records credential lifecycle operations (login, logout, token refresh, revocation) and auth flow steps.
253
+ _Avoid_: server event, auth event, lifecycle event
254
+
255
+ **Audit delivery**: External AuditEvents are shipped from the proxy to the server via `POST /audit/events` (fire-and-forget, best-effort). The proxy does not write to a local audit file. The server is the single source of truth for all audit events. `principal_id` is resolved server-side from the PoP JWT on the ingest request — the proxy does not need to supply it.
256
+
243
257
  ---
244
258
 
245
259
  ## Flagged Ambiguities
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: authsome
3
- Version: 0.4.2
3
+ Version: 0.5.0
4
4
  Summary: A portable local authentication library for AI agents and developer tools
5
5
  Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
6
6
  License-Expression: MIT
@@ -14,8 +14,11 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Topic :: Security
15
15
  Classifier: Topic :: Software Development :: Libraries
16
16
  Requires-Python: >=3.13
17
+ Requires-Dist: aiosqlite>=0.20
17
18
  Requires-Dist: argon2-cffi>=25.1.0
19
+ Requires-Dist: asyncpg>=0.30
18
20
  Requires-Dist: base58>=2.1.1
21
+ Requires-Dist: browser-cookie3>=0.19
19
22
  Requires-Dist: click>=8.0
20
23
  Requires-Dist: cryptography>=41.0
21
24
  Requires-Dist: fastapi>=0.115
@@ -23,6 +26,8 @@ Requires-Dist: jinja2>=3.1
23
26
  Requires-Dist: keyring>=24.0
24
27
  Requires-Dist: loguru>=0.7
25
28
  Requires-Dist: mitmproxy>=11.0
29
+ Requires-Dist: opentelemetry-api>=1.42.1
30
+ Requires-Dist: opentelemetry-sdk>=1.42.1
26
31
  Requires-Dist: posthog>=3.0
27
32
  Requires-Dist: py-key-value-aio[disk]
28
33
  Requires-Dist: pydantic>=2.0
@@ -32,6 +37,7 @@ Requires-Dist: requests>=2.28
32
37
  Requires-Dist: uvicorn>=0.30
33
38
  Provides-Extra: dev
34
39
  Requires-Dist: httpx>=0.28.1; extra == 'dev'
40
+ Requires-Dist: pre-commit>=4.6.0; extra == 'dev'
35
41
  Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
36
42
  Requires-Dist: pytest-cov>=4.0; extra == 'dev'
37
43
  Requires-Dist: pytest>=7.0; extra == 'dev'
@@ -0,0 +1,22 @@
1
+ # Audit events use OTel Logs API with a SQLite exporter owned by the server
2
+
3
+ The proxy runs on the client machine and the server runs remotely, so writing audit events to a local file produces two disjoint logs that an IT admin cannot view in one place. We need a single server-owned audit store that both the proxy and the server write into.
4
+
5
+ **Decision:** `audit/` is a pure leaf that imports only `opentelemetry-api`. It defines `AuditEvent`, translates it to an OTel `LogRecord`, and emits via the globally registered `LoggerProvider` — with no knowledge of where events go. `server/` owns a custom `SQLiteLogExporter` (implementing the OTel `LogExporter` interface), registers a `LoggerProvider` with a `BatchLogRecordProcessor` at daemon startup, and exposes `GET /audit/events` for admin queries. The proxy ships External AuditEvents to the server fire-and-forget via `POST /audit/events` rather than writing to a local file; the server enriches each inbound event with `principal_id` resolved from the PoP JWT.
6
+
7
+ **Considered alternatives:**
8
+
9
+ - *Flat JSON-lines file per process* — the current approach. Rejected because it produces two disjoint audit logs in the client/server topology, with no queryable interface for the admin view.
10
+ - *Proxy hosted on server* — rejected because it routes all agent traffic through the server machine, adding a network round-trip to every API call and making the server a traffic bottleneck.
11
+ - *Pure OTLP to an external collector* — rejected as the primary store because it requires operator-provisioned infrastructure. OTLP remains a valid future second exporter on the same `LoggerProvider` for teams that already run Grafana or Datadog.
12
+ - *SQLite owned by `audit/`* — rejected to preserve `audit/` as a dependency-free leaf. Storage decisions belong to `server/`, consistent with how all other server-owned state is managed.
13
+
14
+ **Not considered:** replacing loguru with OTel for operational logging. Loguru (68 call sites) serves developers debugging live systems — free-form, level-filtered, short-retention. Audit serves IT admins answering compliance questions — structured, required fields, long-retention, queryable. Routing loguru through the SQLite exporter would fill the admin view with operational noise. They are different things with different audiences and must stay separate.
15
+
16
+ **Consequences:**
17
+
18
+ - `audit/` gains `opentelemetry-api` as a dependency; `server/` gains `opentelemetry-sdk` and `aiosqlite` (or `sqlite3`).
19
+ - `audit.setup()` / `audit.clear()` are removed; `server/app.py` lifespan manages the `LoggerProvider`.
20
+ - The proxy's two existing direct `audit.log()` calls (`proxy_no_credentials`, `proxy_deny`) move to fire-and-forget HTTP posts to the server.
21
+ - A second OTLP exporter can be added to the `LoggerProvider` at any time without touching `audit/` or `proxy/`.
22
+ - All audit events — Internal (server) and External (proxy) — are queryable from a single `GET /audit/events` endpoint.
@@ -0,0 +1,18 @@
1
+ # Principal roles: admin / user, first-created principal is admin
2
+
3
+ Principals need an authorization tier to gate deployment-level operations (audit log access, provider registration/deletion, cross-vault credential revocation) from per-principal operations (own connections, claim accept/reject). We store a `role` column (`admin` | `user`) directly on the `principals` table. The first Principal created on a server is assigned `admin`; all subsequent Principals receive `user`. Role assignment is immutable at creation time (mutation is deferred to a future milestone).
4
+
5
+ ## Considered options
6
+
7
+ **Environment variable (`AUTHSOME_ADMIN_PRINCIPALS`)** — the prior approach. Rejected because it requires knowing the PrincipalId before the server starts, cannot be changed without a restart, and is invisible to the UI and route layer.
8
+
9
+ **Separate `principal_roles` table** — considered for future extensibility (multiple roles per principal). Rejected as premature: the role model is binary and a join adds complexity without benefit today.
10
+
11
+ **Default admin account created at server init** — would require deciding on credentials before any real user exists. Rejected in favour of first-user-becomes-admin: the first principal to register is admin, all subsequent principals are users. (Originally justified as "zero-config" for an implicit local principal; that implicit-principal path was later removed when local and hosted were unified into a single registration + claim flow — see ADR 0007. First-principal-is-admin remains the rule, now reached the same way in every deployment.)
12
+
13
+ ## Consequences
14
+
15
+ - `AUTHSOME_ADMIN_PRINCIPALS` env var and `is_admin_principal()` are removed entirely.
16
+ - Admin enforcement at the route level uses a `get_admin_auth_service` FastAPI dependency (parallel to `get_protected_auth_service`) that raises `HTTP 403` for non-admin principals.
17
+ - Admin-only routes: `GET /audit/events`, `POST /providers`, `DELETE /providers/{provider}`, `POST /connections/{provider}/revoke`.
18
+ - Schema migration: `ALTER TABLE principals ADD COLUMN role TEXT NOT NULL DEFAULT 'user'`, followed by setting the earliest-created principal to `'admin'`.
@@ -0,0 +1,36 @@
1
+ # Unified deployment flow: one registration + claim path for every deployment
2
+
3
+ The daemon previously branched on a deployment mode (`AUTHSOME_DEPLOYMENT_MODE`, defaulting to `local`) selected at startup, and ran two parallel implementations of nearly every ownership concept:
4
+
5
+ - **Local**: every Identity collapsed onto one synthetic Principal (`local@authsome.internal`); no claim was required; the Ed25519 PoP key was the only credential. Implemented by `LocalOwnershipResolver` and `LocalIdentityBootstrapService`.
6
+ - **Hosted**: each account was its own Principal authenticated by email+password in the browser; an Identity had to be explicitly claimed and accepted. Implemented by `HostedOwnershipResolver` and `HostedIdentityBootstrapService`.
7
+
8
+ Two code paths doubled the test surface, scattered `if get_deployment_mode() == "hosted"` branches across `dependencies.py`, `routes/_deps.py`, `routes/ui.py`, `routes/health.py`, and `credential_service.py`, and — most importantly — meant "local and hosted behave the same" was asserted in prose but never enforced in code, so the two paths were free to drift. The synthetic local Principal also had a latent wart: a second local Identity silently inherited the *admin* Principal and its Vault, which the hosted model would never allow.
9
+
10
+ ## Decision
11
+
12
+ Collapse to a single flow, identical for every deployment. There is no deployment mode.
13
+
14
+ 1. `authsome init` generates the Ed25519 Identity and registers it; the daemon returns `registration_status = "claim_required"` with a browser **claim URL**.
15
+ 2. The user opens the claim URL and **registers (or logs in) with email + password**. The first Principal created on a server becomes **admin** (ADR 0006); all subsequent Principals are users.
16
+ 3. The authenticated Principal **confirms the claim**, binding the Identity to the Principal and creating the Principal's default Vault.
17
+ 4. PoP-authenticated calls are then authorized; `OwnershipResolver.resolve` requires an *accepted* claim.
18
+
19
+ The one irreducible difference between a single-machine and a networked deployment — *who authenticates the claiming Principal* — is resolved by always requiring the email+password browser step. Local is no longer special-cased; the local user is simply the first to sign up and therefore the admin.
20
+
21
+ The CLI (`AuthsomeApiClient.ensure_identity_ready`) was already mode-agnostic: it reacts to `claim_required` by opening the browser and polling, so it required no behavioural change. It now prints the claim URL to stderr so headless users can complete the step manually.
22
+
23
+ This supersedes the local/hosted split described in ADR 0003 (§ "local mode … hosted mode") and the "zero-config local" rationale in ADR 0006.
24
+
25
+ ## Considered alternatives
26
+
27
+ **Single resolver with an injected claim-acceptance policy** (local auto-accepts, hosted requires a human). Keeps one code path while preserving local's zero-config experience. Rejected by explicit product decision: we want local and hosted to be byte-for-byte identical, with no second path or policy seam to maintain.
28
+
29
+ **Keep two resolvers, only harden with tests + docs.** Smallest change, but leaves the drift risk and duplicate test surface in place. Rejected.
30
+
31
+ ## Consequences
32
+
33
+ - `AUTHSOME_DEPLOYMENT_MODE`, `get_deployment_mode()`, `LOCAL_PRINCIPAL_EMAIL`, the `Local*`/`Hosted*` resolver and bootstrap classes, and the `AuthService(deployment_mode=...)` parameter are all removed. `OwnershipResolver` and `IdentityBootstrapService` are single concrete classes.
34
+ - Admin enforcement is purely role-based: `_ensure_admin_operation_allowed` / `_ensure_provider_client_mutation_allowed` raise for any non-admin Principal, in every deployment (previously non-admins were implicitly allowed in local mode because the sole local Principal was always admin).
35
+ - The server-rendered UI always requires a hosted browser session; the local filesystem-identity UI path is gone. `HealthResponse.mode` is removed.
36
+ - **Breaking change.** Existing local installs have an Identity registered with no accepted claim and data under the `local@authsome.internal` Principal/Vault. After upgrading, those Identities are rejected until the user registers a Principal (email+password) and claims the Identity. A migration that rebinds the existing local Vault to a freshly registered Principal is possible but is intentionally out of scope here.