authsome 0.3.2__tar.gz → 0.4.1__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 (353) hide show
  1. authsome-0.4.1/.github/release-please-manifest.json +3 -0
  2. {authsome-0.3.2 → authsome-0.4.1}/AGENTS.md +21 -10
  3. {authsome-0.3.2 → authsome-0.4.1}/CHANGELOG.md +58 -0
  4. authsome-0.4.1/CONTEXT.md +251 -0
  5. {authsome-0.3.2 → authsome-0.4.1}/CONTRIBUTING.md +3 -0
  6. {authsome-0.3.2 → authsome-0.4.1}/PKG-INFO +10 -1
  7. {authsome-0.3.2 → authsome-0.4.1}/README.md +8 -0
  8. authsome-0.4.1/TODOS.md +274 -0
  9. authsome-0.4.1/assets/authsome-logo-dark.svg +31 -0
  10. authsome-0.4.1/assets/authsome-logo-light.svg +31 -0
  11. authsome-0.4.1/docs/UBIQUITOUS_LANGUAGE.md +128 -0
  12. authsome-0.4.1/docs/adr/0003-principal-owned-vault.md +33 -0
  13. authsome-0.4.1/docs/adr/0003-proxy-unmatched-pass-through.md +47 -0
  14. authsome-0.4.1/docs/agents/domain.md +37 -0
  15. authsome-0.4.1/docs/agents/issue-tracker.md +22 -0
  16. authsome-0.4.1/docs/agents/triage-labels.md +15 -0
  17. {authsome-0.3.2 → authsome-0.4.1}/docs/internal/manual-testing.md +61 -48
  18. authsome-0.4.1/docs/refactor.md +503 -0
  19. {authsome-0.3.2 → authsome-0.4.1}/docs/site/docs.json +1 -0
  20. authsome-0.4.1/docs/site/favicon.svg +106 -0
  21. {authsome-0.3.2 → authsome-0.4.1}/docs/site/installation.mdx +11 -3
  22. authsome-0.4.1/docs/site/integrations/agents/hermes.mdx +166 -0
  23. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/index.mdx +4 -1
  24. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/nanoclaw.mdx +6 -4
  25. authsome-0.4.1/docs/site/logo/dark.svg +31 -0
  26. authsome-0.4.1/docs/site/logo/light.svg +31 -0
  27. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/daemon-api.mdx +26 -2
  28. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/file-layout.mdx +3 -3
  29. {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/encryption.mdx +20 -4
  30. {authsome-0.3.2 → authsome-0.4.1}/pyproject.toml +2 -1
  31. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/__init__.py +0 -3
  32. authsome-0.4.1/src/authsome/auth/__init__.py +1 -0
  33. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/api_key.py +2 -2
  34. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/base.py +2 -2
  35. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/dcr_pkce.py +2 -2
  36. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/device_code.py +2 -2
  37. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/pkce.py +2 -2
  38. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/config.py +1 -1
  39. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/connection.py +12 -6
  40. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/sessions.py +5 -2
  41. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/utils.py +2 -10
  42. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/client.py +64 -11
  43. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/daemon_control.py +2 -6
  44. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/main.py +72 -19
  45. authsome-0.4.1/src/authsome/identity/__init__.py +73 -0
  46. authsome-0.3.2/src/authsome/identity/keys.py → authsome-0.4.1/src/authsome/identity/local.py +62 -21
  47. authsome-0.4.1/src/authsome/identity/principal.py +61 -0
  48. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/identity/proof.py +1 -1
  49. authsome-0.4.1/src/authsome/identity/registry.py +19 -0
  50. authsome-0.4.1/src/authsome/server/analytics.py +63 -0
  51. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/app.py +26 -10
  52. authsome-0.3.2/src/authsome/auth/service.py → authsome-0.4.1/src/authsome/server/credential_service.py +174 -111
  53. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/dependencies.py +108 -7
  54. authsome-0.4.1/src/authsome/server/hosted_auth.py +114 -0
  55. authsome-0.4.1/src/authsome/server/identity_bootstrap.py +116 -0
  56. authsome-0.4.1/src/authsome/server/ownership.py +116 -0
  57. authsome-0.4.1/src/authsome/server/proxy_catalog.py +73 -0
  58. authsome-0.4.1/src/authsome/server/registries.py +266 -0
  59. authsome-0.4.1/src/authsome/server/routes/_deps.py +180 -0
  60. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/auth.py +103 -75
  61. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/connections.py +38 -26
  62. authsome-0.4.1/src/authsome/server/routes/health.py +153 -0
  63. authsome-0.4.1/src/authsome/server/routes/identities.py +45 -0
  64. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/providers.py +19 -19
  65. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/proxy.py +13 -10
  66. authsome-0.4.1/src/authsome/server/routes/ui.py +821 -0
  67. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/schemas.py +6 -0
  68. authsome-0.4.1/src/authsome/server/ui/pages.py +421 -0
  69. authsome-0.4.1/src/authsome/server/ui_sessions.py +146 -0
  70. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/static/app.js +32 -2
  71. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/static/style.css +85 -0
  72. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/_layout.html +12 -6
  73. authsome-0.4.1/src/authsome/ui/templates/app_detail_managed.html +24 -0
  74. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_oauth.html +0 -46
  75. authsome-0.4.1/src/authsome/ui/templates/app_provider.html +128 -0
  76. authsome-0.4.1/src/authsome/ui/templates/applications.html +57 -0
  77. authsome-0.4.1/src/authsome/ui/templates/connections.html +51 -0
  78. authsome-0.4.1/src/authsome/ui/templates/identity.html +16 -0
  79. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/utils.py +40 -1
  80. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/vault/__init__.py +62 -7
  81. authsome-0.4.1/src/authsome/vault/crypto.py +365 -0
  82. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_flows.py +18 -0
  83. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_models.py +6 -2
  84. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_service.py +21 -5
  85. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_service_provider_clients.py +156 -40
  86. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/conftest.py +9 -1
  87. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_client_signing.py +95 -3
  88. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_identity.py +1 -1
  89. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_init.py +12 -4
  90. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_ui.py +4 -4
  91. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_whoami.py +25 -1
  92. {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_utils.py +4 -0
  93. {authsome-0.3.2 → authsome-0.4.1}/tests/conftest.py +1 -0
  94. {authsome-0.3.2 → authsome-0.4.1}/tests/identity/test_identity.py +27 -1
  95. {authsome-0.3.2 → authsome-0.4.1}/tests/identity/test_proof.py +1 -1
  96. authsome-0.4.1/tests/identity/test_registry.py +41 -0
  97. {authsome-0.3.2 → authsome-0.4.1}/tests/proxy/test_proxy.py +2 -2
  98. authsome-0.4.1/tests/server/test_analytics.py +43 -0
  99. {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_auth_sessions.py +8 -2
  100. authsome-0.4.1/tests/server/test_hosted_auth.py +83 -0
  101. authsome-0.4.1/tests/server/test_identity_bootstrap.py +66 -0
  102. authsome-0.4.1/tests/server/test_ownership.py +63 -0
  103. {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_pop_auth.py +87 -4
  104. {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_provider_operation_policy.py +14 -1
  105. authsome-0.4.1/tests/server/test_ui_dashboard.py +516 -0
  106. authsome-0.4.1/tests/server/test_ui_sessions.py +292 -0
  107. {authsome-0.3.2 → authsome-0.4.1}/tests/vault/test_crypto.py +117 -3
  108. authsome-0.4.1/tests/vault/test_rekey.py +167 -0
  109. {authsome-0.3.2 → authsome-0.4.1}/uv.lock +152 -117
  110. authsome-0.3.2/.github/release-please-manifest.json +0 -3
  111. authsome-0.3.2/assets/authsome-logo-dark.svg +0 -6
  112. authsome-0.3.2/assets/authsome-logo-light.svg +0 -6
  113. authsome-0.3.2/docs/UBIQUITOUS_LANGUAGE.md +0 -111
  114. authsome-0.3.2/docs/site/favicon.svg +0 -4
  115. authsome-0.3.2/docs/site/logo/dark.svg +0 -6
  116. authsome-0.3.2/docs/site/logo/light.svg +0 -6
  117. authsome-0.3.2/src/authsome/auth/__init__.py +0 -8
  118. authsome-0.3.2/src/authsome/identity/__init__.py +0 -44
  119. authsome-0.3.2/src/authsome/identity/registry.py +0 -87
  120. authsome-0.3.2/src/authsome/server/analytics.py +0 -37
  121. authsome-0.3.2/src/authsome/server/routes/_deps.py +0 -96
  122. authsome-0.3.2/src/authsome/server/routes/health.py +0 -119
  123. authsome-0.3.2/src/authsome/server/routes/identities.py +0 -38
  124. authsome-0.3.2/src/authsome/server/routes/ui.py +0 -485
  125. authsome-0.3.2/src/authsome/server/ui/pages.py +0 -199
  126. authsome-0.3.2/src/authsome/server/ui_sessions.py +0 -128
  127. authsome-0.3.2/src/authsome/ui/templates/connections.html +0 -60
  128. authsome-0.3.2/src/authsome/vault/crypto.py +0 -153
  129. authsome-0.3.2/tests/server/test_ui_sessions.py +0 -115
  130. {authsome-0.3.2 → authsome-0.4.1}/.claude/commands/run-evals.md +0 -0
  131. {authsome-0.3.2 → authsome-0.4.1}/.claude-plugin/marketplace.json +0 -0
  132. {authsome-0.3.2 → authsome-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  133. {authsome-0.3.2 → authsome-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  134. {authsome-0.3.2 → authsome-0.4.1}/.github/dependabot.yml +0 -0
  135. {authsome-0.3.2 → authsome-0.4.1}/.github/pull_request_template.md +0 -0
  136. {authsome-0.3.2 → authsome-0.4.1}/.github/release-please-config.json +0 -0
  137. {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/pr-title.yml +0 -0
  138. {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/publish-rc.yml +0 -0
  139. {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/publish.yml +0 -0
  140. {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/release-please.yml +0 -0
  141. {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/test.yml +0 -0
  142. {authsome-0.3.2 → authsome-0.4.1}/.gitignore +0 -0
  143. {authsome-0.3.2 → authsome-0.4.1}/.pre-commit-config.yaml +0 -0
  144. {authsome-0.3.2 → authsome-0.4.1}/CLAUDE.md +0 -0
  145. {authsome-0.3.2 → authsome-0.4.1}/LICENSE +0 -0
  146. {authsome-0.3.2 → authsome-0.4.1}/assets/authsome-how-it-works-dark.svg +0 -0
  147. {authsome-0.3.2 → authsome-0.4.1}/assets/authsome-how-it-works-light.svg +0 -0
  148. {authsome-0.3.2 → authsome-0.4.1}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
  149. {authsome-0.3.2 → authsome-0.4.1}/docs/adr/0002-server-registered-identities.md +0 -0
  150. {authsome-0.3.2 → authsome-0.4.1}/docs/internal/authsome-design.md +0 -0
  151. {authsome-0.3.2 → authsome-0.4.1}/docs/internal/cli-design-review.md +0 -0
  152. {authsome-0.3.2 → authsome-0.4.1}/docs/register-provider.md +0 -0
  153. {authsome-0.3.2 → authsome-0.4.1}/docs/site/README.md +0 -0
  154. {authsome-0.3.2 → authsome-0.4.1}/docs/site/changelog.mdx +0 -0
  155. {authsome-0.3.2 → authsome-0.4.1}/docs/site/compared.mdx +0 -0
  156. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/architecture.mdx +0 -0
  157. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/credential-storage.mdx +0 -0
  158. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/profiles-vs-connections.mdx +0 -0
  159. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/provider-registry.mdx +0 -0
  160. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/proxy-injection.mdx +0 -0
  161. {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/the-daemon.mdx +0 -0
  162. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/custom-providers.mdx +0 -0
  163. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/headless-device-code.mdx +0 -0
  164. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/login-with-oauth.mdx +0 -0
  165. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/multiple-connections.mdx +0 -0
  166. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/profiles.mdx +0 -0
  167. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
  168. {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/use-api-keys.mdx +0 -0
  169. {authsome-0.3.2 → authsome-0.4.1}/docs/site/images/login-github-authsome.png +0 -0
  170. {authsome-0.3.2 → authsome-0.4.1}/docs/site/index.mdx +0 -0
  171. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/anthropic-sdk.mdx +0 -0
  172. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/claude-code.mdx +0 -0
  173. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/codex.mdx +0 -0
  174. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/cowork.mdx +0 -0
  175. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/cursor.mdx +0 -0
  176. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/langchain.mdx +0 -0
  177. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/llamaindex.mdx +0 -0
  178. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/openai-agents-sdk.mdx +0 -0
  179. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/opencode.mdx +0 -0
  180. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/python.mdx +0 -0
  181. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/ahrefs.mdx +0 -0
  182. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/apollo.mdx +0 -0
  183. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/ashby.mdx +0 -0
  184. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/beehiiv.mdx +0 -0
  185. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/brevo.mdx +0 -0
  186. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/buffer.mdx +0 -0
  187. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/calendly.mdx +0 -0
  188. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/clearbit.mdx +0 -0
  189. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/dub.mdx +0 -0
  190. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/g2.mdx +0 -0
  191. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/hunter.mdx +0 -0
  192. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/index.mdx +0 -0
  193. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/instantly.mdx +0 -0
  194. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/intercom.mdx +0 -0
  195. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/keywords-everywhere.mdx +0 -0
  196. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/klaviyo.mdx +0 -0
  197. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/lemlist.mdx +0 -0
  198. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/livestorm.mdx +0 -0
  199. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/mailchimp.mdx +0 -0
  200. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/mention-me.mdx +0 -0
  201. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/openai.mdx +0 -0
  202. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/optimizely.mdx +0 -0
  203. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/postmark.mdx +0 -0
  204. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/resend.mdx +0 -0
  205. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/rewardful.mdx +0 -0
  206. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/savvycal.mdx +0 -0
  207. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/semrush.mdx +0 -0
  208. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/sendgrid.mdx +0 -0
  209. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/tolt.mdx +0 -0
  210. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/typeform.mdx +0 -0
  211. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/wistia.mdx +0 -0
  212. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/zapier.mdx +0 -0
  213. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/atlassian.mdx +0 -0
  214. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/discord.mdx +0 -0
  215. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/github.mdx +0 -0
  216. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/gitlab.mdx +0 -0
  217. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/google.mdx +0 -0
  218. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/hubspot.mdx +0 -0
  219. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/index.mdx +0 -0
  220. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/klaviyo-oauth.mdx +0 -0
  221. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/linear.mdx +0 -0
  222. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/microsoft.mdx +0 -0
  223. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/notion-dcr.mdx +0 -0
  224. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/notion.mdx +0 -0
  225. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/postiz.mdx +0 -0
  226. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/slack.mdx +0 -0
  227. {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/x.mdx +0 -0
  228. {authsome-0.3.2 → authsome-0.4.1}/docs/site/quickstart.mdx +0 -0
  229. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/audit-log.mdx +0 -0
  230. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/bundled-providers.mdx +0 -0
  231. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/cli.mdx +0 -0
  232. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/environment-variables.mdx +0 -0
  233. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/provider-schema.mdx +0 -0
  234. {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/python-library.mdx +0 -0
  235. {authsome-0.3.2 → authsome-0.4.1}/docs/site/roadmap.mdx +0 -0
  236. {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/daemon-trust-boundary.mdx +0 -0
  237. {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/disclosure.mdx +0 -0
  238. {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/hosted-deployment.mdx +0 -0
  239. {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/threat-model.mdx +0 -0
  240. {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/masked-input-note.mdx +0 -0
  241. {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/multi-connections-cta.mdx +0 -0
  242. {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/whats-next-apikey.mdx +0 -0
  243. {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/whats-next-oauth.mdx +0 -0
  244. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/auth-errors.mdx +0 -0
  245. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/daemon-issues.mdx +0 -0
  246. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/doctor.mdx +0 -0
  247. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
  248. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
  249. {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/token-refresh.mdx +0 -0
  250. {authsome-0.3.2 → authsome-0.4.1}/evals/.gitignore +0 -0
  251. {authsome-0.3.2 → authsome-0.4.1}/evals/evals.json +0 -0
  252. {authsome-0.3.2 → authsome-0.4.1}/evals/generate_report.py +0 -0
  253. {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/SKILL.md +0 -0
  254. {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/references/adding-provider.md +0 -0
  255. {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/references/feedback.md +0 -0
  256. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/audit/__init__.py +0 -0
  257. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/__init__.py +0 -0
  258. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
  259. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/apollo.json +0 -0
  260. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/ashby.json +0 -0
  261. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
  262. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
  263. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/brevo.json +0 -0
  264. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/buffer.json +0 -0
  265. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/calendly.json +0 -0
  266. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
  267. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/discord.json +0 -0
  268. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/dub.json +0 -0
  269. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/g2.json +0 -0
  270. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/github.json +0 -0
  271. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
  272. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/google.json +0 -0
  273. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
  274. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/hunter.json +0 -0
  275. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/instantly.json +0 -0
  276. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/intercom.json +0 -0
  277. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
  278. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
  279. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
  280. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
  281. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/linear.json +0 -0
  282. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
  283. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
  284. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
  285. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
  286. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/notion.json +0 -0
  287. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
  288. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/openai.json +0 -0
  289. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
  290. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/postiz.json +0 -0
  291. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/postmark.json +0 -0
  292. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/resend.json +0 -0
  293. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
  294. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
  295. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/semrush.json +0 -0
  296. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
  297. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/slack.json +0 -0
  298. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/tolt.json +0 -0
  299. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/typeform.json +0 -0
  300. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/wistia.json +0 -0
  301. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/x.json +0 -0
  302. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/zapier.json +0 -0
  303. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/__init__.py +0 -0
  304. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/input_provider.py +0 -0
  305. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/__init__.py +0 -0
  306. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/enums.py +0 -0
  307. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/provider.py +0 -0
  308. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/__init__.py +0 -0
  309. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/client_config.py +0 -0
  310. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/context.py +0 -0
  311. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/helpers.py +0 -0
  312. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/errors.py +0 -0
  313. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/paths.py +0 -0
  314. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/__init__.py +0 -0
  315. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/certs.py +0 -0
  316. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/router.py +0 -0
  317. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/runner.py +0 -0
  318. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/server.py +0 -0
  319. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/py.typed +0 -0
  320. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/__init__.py +0 -0
  321. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/daemon.py +0 -0
  322. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/__init__.py +0 -0
  323. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/ui/__init__.py +0 -0
  324. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/ui/web_theme.py +0 -0
  325. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/urls.py +0 -0
  326. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/__init__.py +0 -0
  327. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/interfaces.py +0 -0
  328. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/local.py +0 -0
  329. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/__init__.py +0 -0
  330. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/_app_detail_shell.html +0 -0
  331. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_apikey.html +0 -0
  332. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_disconnected.html +0 -0
  333. {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/overview.html +0 -0
  334. {authsome-0.3.2 → authsome-0.4.1}/tests/__init__.py +0 -0
  335. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/__init__.py +0 -0
  336. {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_url_template.py +0 -0
  337. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/__init__.py +0 -0
  338. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_daemon.py +0 -0
  339. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_doctor.py +0 -0
  340. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_get.py +0 -0
  341. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_helpers.py +0 -0
  342. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_import_env.py +0 -0
  343. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_list.py +0 -0
  344. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_login.py +0 -0
  345. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_logout.py +0 -0
  346. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_register.py +0 -0
  347. {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_revoke.py +0 -0
  348. {authsome-0.3.2 → authsome-0.4.1}/tests/common/__init__.py +0 -0
  349. {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_audit.py +0 -0
  350. {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_errors.py +0 -0
  351. {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_logging.py +0 -0
  352. {authsome-0.3.2 → authsome-0.4.1}/tests/proxy/__init__.py +0 -0
  353. {authsome-0.3.2 → authsome-0.4.1}/tests/vault/__init__.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.4.1"
3
+ }
@@ -56,6 +56,8 @@ These rules govern all changes to this codebase — apply them without exception
56
56
 
57
57
  **Deep modules over shallow ones.** Prefer a small surface area with rich internals over many thin wrappers. More files is not more modular.
58
58
 
59
+ **Composition over inheritance.** Prefer small collaborators wired together through explicit dependencies over inheritance hierarchies. Use inheritance only when there is a real subtype relationship and composition would make the design less clear.
60
+
59
61
  **Single responsibility and separation of concerns.** Auth authenticates. Vault stores credentials. CLI presents output. A flow must not write to storage; storage must not know about OAuth. If a function is hard to name, it's doing too many things.
60
62
 
61
63
  **No premature optimization.** Don't add caching, batching, or concurrency before a measured performance problem exists. Simple and slow is fixable; complex and wrong is not.
@@ -102,15 +104,24 @@ These rules govern all changes to this codebase — apply them without exception
102
104
 
103
105
  ## Architecture
104
106
 
105
- **Identity (`src/authsome/identity/`)** manages local Ed25519 key pairs and `did:key` DIDs. `ensure_local_identity(home, active_handle)` returns the identity named in `GlobalConfig.active_identity`, or creates a new one if none exists. Key material lives at `~/.authsome/identities/<handle>.key` (mode `0600`); metadata at `~/.authsome/identities/<handle>.json`. Identity = Profile: the handle is both the cryptographic identity name and the credential namespace key.
107
+ **Identity (`src/authsome/identity/local.py`)** manages local Ed25519 key pairs and `did:key` DIDs. Key material lives at `~/.authsome/identities/<handle>.key` (mode `0600`); metadata at `~/.authsome/identities/<handle>.json`. An Identity is a cryptographic agent — it is not a credential namespace. Credential namespacing is owned by a Vault (see below).
106
108
 
107
- **PoP Auth (`src/authsome/identity/proof.py`)** implements Proof-of-Possession JWT creation and validation. Every protected daemon request carries `Authorization: PoP <jwt>` signed with the local Ed25519 key. The JWT is bound to the specific HTTP method, path, and body SHA-256. The daemon validates the signature, checks the `jti` replay cache, and confirms `sub` (handle) `iss` (DID) via the Identity Registry.
109
+ **Principal & Vault domain models (`src/authsome/identity/principal.py`)** define the two concepts that own credentials. A **Principal** is a non-cryptographic logical partition (human or team) identified by an opaque `PrincipalId`. A **Vault** is a named credential store owned by exactly one Principal and identified by an opaque `VaultId`. Credentials are scoped to a vault: `vault:<vault_id>:...`. An Identity claims membership in a Principal via an `IdentityClaimRecord`; the claim must be accepted before vault access is granted.
108
110
 
109
- **Identity Registry (`src/authsome/identity/registry.py`)** is the daemon-owned authoritative handle→DID mapping, persisted at `~/.authsome/server/identity_registry.json`.
111
+ **Five server-owned registries** persist in `~/.authsome/server/` and are implemented in `src/authsome/server/registries.py`:
112
+ | Registry | File | Authoritative for |
113
+ |----------|------|-------------------|
114
+ | `IdentityRegistry` | `identity_registry.json` | Handle → DID mapping (PoP JWT validation) |
115
+ | `PrincipalRegistry` | `principal_registry.json` | PrincipalId → email |
116
+ | `VaultRegistry` | `vault_registry.json` | VaultId → VaultHandle |
117
+ | `IdentityClaimRegistry` | `identity_claim_registry.json` | Identity → Principal claim + ClaimStatus |
118
+ | `PrincipalVaultBindingRegistry` | `principal_vault_binding_registry.json` | Principal → default Vault binding |
119
+
120
+ **PoP Auth (`src/authsome/identity/proof.py`)** implements Proof-of-Possession JWT creation and validation. Every protected daemon request carries `Authorization: PoP <jwt>` signed with the local Ed25519 key. The JWT is bound to the specific HTTP method, path, and body SHA-256. The daemon validates the signature, checks the `jti` replay cache, and confirms `sub` (handle) → `iss` (DID) via the Identity Registry.
110
121
 
111
- **AuthService (`src/authsome/auth/service.py`)** is the authentication and credential lifecycle layer. It owns OAuth flows, token refresh, login/logout/revoke. Constructed with `vault` and `identity` (the handle); all store keys are namespaced as `profile:<handle>:...`.
122
+ **AuthService (`src/authsome/server/credential_service.py`)** is the authentication and credential lifecycle coordinator. It owns OAuth flows, token refresh, login/logout/revoke. Lives in `server/` because it coordinates `auth/` flows with `vault/` storage and `audit/` logging. Constructed with `(vault, identity, principal_id, vault_id)`; all credential store keys are namespaced as `vault:<vault_id>:...`. The caller (server dependency injection) resolves `vault_id` from the `PrincipalVaultBindingRegistry` before constructing `AuthService`.
112
123
 
113
- **Flows (`src/authsome/auth/flows/`)** implement the `AuthFlow.authenticate()` interface. Each flow returns a `ConnectionRecord`.
124
+ **Flows (`src/authsome/auth/flows/`)** implement the `AuthFlow.authenticate()` interface. Each flow returns a `ConnectionRecord`. The `auth/` module is a leaf — it imports nothing from `vault/`, `audit/`, or `server/`.
114
125
 
115
126
  | Flow | Class | Notes |
116
127
  |------|-------|-------|
@@ -119,19 +130,19 @@ These rules govern all changes to this codebase — apply them without exception
119
130
  | `dcr_pkce` | `DcrPkceFlow` | Dynamic Client Registration then PKCE |
120
131
  | `api_key` | `ApiKeyFlow` | Prompts via secure browser bridge |
121
132
 
122
- **Provider Registry (`src/authsome/auth/service.py`)** resolves providers in this order: local `~/.authsome/providers/<name>.json` overrides bundled JSON in `src/authsome/bundled_providers/`. Bundled providers (GitHub, Google, Okta, Linear, OpenAI) are loaded via `importlib.resources`.
133
+ **Provider Registry** resolves providers in this order: custom providers stored in the vault under the `providers` collection override bundled JSON in `src/authsome/auth/bundled_providers/`. Bundled providers (GitHub, Google, Okta, Linear, OpenAI) are loaded via `importlib.resources`.
123
134
 
124
135
  **Vault (`src/authsome/vault/`)** is the encrypted KV store. The master key lives at `~/.authsome/server/master.key` (mode `0600`) or in the OS keyring. All credential blobs are encrypted at rest; the AuthService reads and writes plaintext through the Vault without knowing encryption details.
125
136
 
126
137
  **Storage** uses a DiskStore-backed KV at `~/.authsome/server/kv_store/`. Store keys follow the pattern:
127
138
  ```
128
- profile:<handle>:<provider>:connection:<connection_name>
129
- profile:<handle>:<provider>:metadata
130
- profile:<handle>:<provider>:state
139
+ vault:<vault_id>:<provider>:connection:<connection_name>
140
+ vault:<vault_id>:<provider>:metadata
141
+ vault:<vault_id>:<provider>:state
131
142
  server:<provider>:client
132
143
  ```
133
144
 
134
- **Config** (`GlobalConfig`) is stored in the KV store under `config/global`. Key field: `active_identity` (the handle of the current identity). Encryption mode is set via `config.encryption.mode` (`local_key` or `keyring`).
145
+ **Config** (`GlobalConfig`) is stored in the KV store under `config/global`. Key fields: `active_identity` (the handle of the current identity), `vault_id` (the active vault resolved at `authsome init`). Encryption mode is set via `config.encryption.mode` (`local_key` or `keyring`).
135
146
 
136
147
  **CLI (`src/authsome/cli/main.py`)** is Click-based. All commands support `--json` for machine-readable output. `authsome init` creates the local identity, registers it with the daemon, and writes `active_identity` to config.
137
148
 
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.1](https://github.com/agentrhq/authsome/compare/authsome-v0.4.0...authsome-v0.4.1) (2026-05-25)
4
+
5
+
6
+ ### Features
7
+
8
+ * enable provider configuration management for hosted admins with required credential inputs and scope persistence ([e26d584](https://github.com/agentrhq/authsome/commit/e26d5841f34467af77e67903eaf6ee8b97d59313))
9
+ * enable provider configuration management for hosted admins with… ([30b2f8a](https://github.com/agentrhq/authsome/commit/30b2f8a3814a04b710fd37206889e3e1a71fd43f))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * rename AUTHSOME_ADMIN_PRINCIPLES environment variable to fix typo ([10f17f4](https://github.com/agentrhq/authsome/commit/10f17f48e35f118e76d7cb5c797a498408c51db7))
15
+
16
+ ## [0.4.0](https://github.com/agentrhq/authsome/compare/authsome-v0.3.2...authsome-v0.4.0) (2026-05-25)
17
+
18
+
19
+ ### ⚠ BREAKING CHANGES
20
+
21
+ * Create version 0.4 which adds support for principal, identity, vault key loading precedence and many more fixes
22
+
23
+ ### Features
24
+
25
+ * ClaimStatus lifecycle, vault_id gating, ADR 0003 alignment ([d8553ba](https://github.com/agentrhq/authsome/commit/d8553baabbfba595580fd0d6d0c0a90ba282e911))
26
+ * Cleanup server routes ([225d7fd](https://github.com/agentrhq/authsome/commit/225d7fdcfba184c60bffdb70ba28e9576109b25c))
27
+ * disable analytics automatically when running under pytest and add verification tests ([d1abc48](https://github.com/agentrhq/authsome/commit/d1abc48f11255419f5d58cc13d5280fa221a3b21))
28
+ * implement HostedAccountService for email/password authentication and JWT session management ([c161ab9](https://github.com/agentrhq/authsome/commit/c161ab96d0d78ad02ce98b5ad4c0269ba3fd0530))
29
+ * implement master key rotation via rekey command and API endpoint ([f78f872](https://github.com/agentrhq/authsome/commit/f78f872624b1da899d76dd0c1a04ee81fafca772))
30
+ * implement opt-out telemetry support via environment variables and add associated documentation and tests ([9d7c88f](https://github.com/agentrhq/authsome/commit/9d7c88fb0a1a777b535f5e06b11a60a00eda263c))
31
+ * implement opt-out telemetry support via environment variables and add associated tests ([1c1554c](https://github.com/agentrhq/authsome/commit/1c1554c9cf3fbf093d107d7c6a3fd15103572096))
32
+ * implement vault rekey functionality with encryption source validation and add corresponding API and unit tests. ([e7f4187](https://github.com/agentrhq/authsome/commit/e7f418707aacde9b7705a5f79c8a84b28878715d))
33
+ * login flow ([e0ea86d](https://github.com/agentrhq/authsome/commit/e0ea86dc99de0d1d616b3c609e48c2ba6a61d516))
34
+ * scope connections to vault, add claim flow and principal concept ([d3f2006](https://github.com/agentrhq/authsome/commit/d3f2006d67c572fef7dd05b539c7e2c83de8ddaa))
35
+
36
+
37
+ ### Bug Fixes
38
+
39
+ * correct import path and test fixture for ready endpoint ([3951af8](https://github.com/agentrhq/authsome/commit/3951af82390994ad6d5acbdc06e59d91c8ccd962))
40
+ * deduplicate error class name in daemon responses and stop orphaned daemon ([76e2320](https://github.com/agentrhq/authsome/commit/76e2320c96e1e06eaa9d6822e98f33f8e027db1c))
41
+ * improve whoami robustness by handling connection failures gracefully and isolating keyring tests ([83709f4](https://github.com/agentrhq/authsome/commit/83709f4e373a3057b49af0e3b9e40b2166883d43))
42
+
43
+
44
+ ### Documentation
45
+
46
+ * add dedicated Hermes Agent integration page, drop stale Hermes refs ([b7297dd](https://github.com/agentrhq/authsome/commit/b7297dd5e658bf20baf0251a21460f6c6b5b7048))
47
+ * add dedicated Hermes Agent integration page, drop stale Hermes refs ([e12082f](https://github.com/agentrhq/authsome/commit/e12082f0786504e5049550375ea97831657125e7))
48
+ * add hosted UI auth and identity claim design spec ([e552805](https://github.com/agentrhq/authsome/commit/e5528053c146e6a8652cd8fe44409d286d8a2d6a))
49
+ * fix CONTEXT.md dependency graph and direction ([17fff13](https://github.com/agentrhq/authsome/commit/17fff13aa893d049b65e16e1922f80130f388da2))
50
+ * make auth/ a leaf module, move AuthService to server/ ([d92611c](https://github.com/agentrhq/authsome/commit/d92611ccd4fc987595034b1e6b1ee49e1049af16))
51
+ * resolve merge conflicts in UBIQUITOUS_LANGUAGE.md ([48229eb](https://github.com/agentrhq/authsome/commit/48229eb8b456cbdaeeb7a7a1a2e0bf02800fb21e))
52
+ * rewrite CONTEXT.md with module boundaries, create TODOS.md ([c7a1629](https://github.com/agentrhq/authsome/commit/c7a1629166324729a9e14868ebaa9ad082165053))
53
+ * rewrite login and proxy sections in manual-testing guide ([3719d13](https://github.com/agentrhq/authsome/commit/3719d13a960430d2839df85b458d55ec83071006))
54
+ * update architecture language, retire Profile, add Principal/Vault/Claim terms ([8dc663e](https://github.com/agentrhq/authsome/commit/8dc663e21e505a5327a7168ea47a245ed94b8db7))
55
+
56
+
57
+ ### Code Refactoring
58
+
59
+ * Create version 0.4 which adds support for principal, identity, vault key loading precedence and many more fixes ([bb5a2a6](https://github.com/agentrhq/authsome/commit/bb5a2a615291a89bfd5c1a581692b2d86a82dca4))
60
+
3
61
  ## [0.3.2](https://github.com/agentrhq/authsome/compare/authsome-v0.3.1...authsome-v0.3.2) (2026-05-20)
4
62
 
5
63
 
@@ -0,0 +1,251 @@
1
+ # authsome
2
+
3
+ authsome is the local auth layer for AI agents — it answers which agent, acting on behalf of whom, accessed what credential, and was that allowed.
4
+
5
+ ## Module Responsibilities
6
+
7
+ Each module has one job. `identity/`, `auth/`, `vault/`, and `audit/` are **leaf modules** — they import nothing from this codebase and can be used and tested in isolation. `server/` is the only composition root.
8
+
9
+ ```
10
+ identity/ ←─┐
11
+ auth/ ←─┤
12
+ vault/ ←─┤ server/ ←── cli/ (via HTTP, not Python import)
13
+ audit/ ←─┘ ←── proxy/ (via HTTP, not Python import)
14
+ ```
15
+
16
+ ---
17
+
18
+ ### `identity/` — Cryptographic identity primitives
19
+
20
+ Think of this as the OpenID Connect layer. Handles key material, DIDs, and proof-of-possession tokens.
21
+
22
+ **Owns:**
23
+ - Ed25519 key pair generation and serialization (`local.py`)
24
+ - `did:key` DID derivation from public keys (`local.py`)
25
+ - `IdentityMetadata` model — client-side cached state for a local identity
26
+ - `IdentityRegistration` model — the server's record of a registered handle/DID binding
27
+ - PoP JWT creation and validation (`proof.py`)
28
+ - `ClaimStatus`, `PrincipalRecord`, `VaultRecord`, `IdentityClaimRecord`, `PrincipalVaultBindingRecord` — shared domain models
29
+
30
+ **Does not own:**
31
+ - Filesystem-backed registries (those are server state, not identity primitives)
32
+ - Client config management (that is `cli/` territory)
33
+ - Principal/vault lifecycle decisions (that is `server/` territory)
34
+
35
+ **Imports nothing from this codebase.** Used by: `server/`, `cli/`
36
+
37
+ ---
38
+
39
+ ### `auth/` — OAuth and API key flow implementations
40
+
41
+ Think of this as the OAuth 2.0 protocol library. Each flow takes provider config and credentials in, returns tokens out. No storage, no audit, no identity imports.
42
+
43
+ **Owns:**
44
+ - OAuth 2.0 flows: PKCE, Device Code, DCR+PKCE (`flows/`)
45
+ - API key collection flow (`flows/api_key.py`)
46
+ - Flow base class and token refresh logic
47
+ - Provider models: `ProviderDefinition`, `OAuthConfig`, `ApiKeyConfig`, bundled provider JSON
48
+ - Credential models: `ConnectionRecord`, `ProviderClientRecord`, `ProviderMetadataRecord`, `ProviderStateRecord`
49
+ - `AuthSession` — transient flow session state
50
+
51
+ **Does not own:**
52
+ - Credential persistence (that is `vault/` + `server/` territory)
53
+ - Audit logging (that is `audit/` + `server/` territory)
54
+ - Proxy route catalog building
55
+ - Server registry reads
56
+
57
+ **Imports nothing from this codebase.** Used by: `server/`
58
+
59
+ ---
60
+
61
+ ### `server/` — CredentialService and application orchestration
62
+
63
+ `server/` owns `CredentialService` (currently called `AuthService`) — the stateful coordinator that wires `auth/` flows with `vault/` storage and `audit/` logging. It is the only place where flows, storage, and audit are combined.
64
+
65
+ `CredentialService` is constructed per-request by the server with `(vault, identity, principal_id, vault_id)` and calls `auth/` flows to execute protocols, `vault/` to persist results, and `audit/` to record events.
66
+
67
+ > Current state: `AuthService` lives in `auth/` and imports `vault/` and `audit/` directly. Moving it to `server/` (TODOS phase E) makes `auth/` a true leaf.
68
+
69
+ ---
70
+
71
+ ### `vault/` — Encrypted credential storage
72
+
73
+ Think of this as the secrets layer. Encrypts and decrypts credential blobs transparently.
74
+
75
+ **Owns:**
76
+ - `Vault` — AES-256-GCM encrypted KV wrapper over `AsyncKeyValue`
77
+ - `VaultCrypto` — key management (local file, OS keyring)
78
+ - Encrypted get/put/delete/list over named collections
79
+
80
+ **Does not own:**
81
+ - Server filesystem layout or path resolution
82
+ - Registry lookups
83
+ - Business logic about which vault belongs to which principal
84
+
85
+ **Imports nothing from this codebase.** Imported by: `auth/`, `server/`
86
+
87
+ ---
88
+
89
+ ### `audit/` — Structured event recording
90
+
91
+ Think of this as the append-only ledger. Records who did what and when.
92
+
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)
97
+
98
+ **Does not own:**
99
+ - Business logic
100
+ - Any storage beyond the append-only log file
101
+
102
+ **Imports nothing from this codebase.** Imported by: `auth/`, `server/`
103
+
104
+ ---
105
+
106
+ ### `server/` — Application orchestration and server-owned state
107
+
108
+ Think of this as the daemon process. Wires identity + auth + vault + audit together. Owns all server-side persistence.
109
+
110
+ **Owns:**
111
+ - `server/registries.py` — all filesystem-backed registry implementations:
112
+ - `IdentityRegistry` (handle → DID)
113
+ - `PrincipalRegistry` (principal_id → email)
114
+ - `VaultRegistry` (vault_id → handle)
115
+ - `IdentityClaimRegistry` (identity → principal + ClaimStatus)
116
+ - `PrincipalVaultBindingRegistry` (principal → default vault)
117
+ - `server/ownership.py` — `OwnershipResolver` (local and hosted variants), `ResolvedOwnership`
118
+ - `server/identity_bootstrap.py` — deployment-specific identity registration behavior
119
+ - `server/dependencies.py` — infrastructure wiring (paths, store, vault, config)
120
+ - `server/app.py` — FastAPI application factory and lifespan
121
+ - `server/routes/` — HTTP API surface
122
+ - `server/schemas.py` — API response schemas
123
+
124
+ **All filesystem interaction for server-owned state lives here.** No other module writes to server-owned paths.
125
+
126
+ **Imported by:** nothing (top of the import graph)
127
+
128
+ ---
129
+
130
+ ### `proxy/` — Credential injection proxy
131
+
132
+ A mitmproxy-based HTTPS proxy. Intercepts outgoing agent requests and injects auth headers.
133
+
134
+ **Owns:**
135
+ - `proxy/server.py` — mitmproxy addon that intercepts requests
136
+ - `proxy/runner.py` — background thread lifecycle
137
+ - `proxy/router.py` — `RouteMatch` / `RouteResolution` types
138
+ - `proxy/certs.py` — CA certificate management
139
+
140
+ **Does not own:**
141
+ - Credential loading (asks the server)
142
+ - Route catalog construction (asks the server)
143
+ - Provider definitions
144
+
145
+ **Imported by:** `cli/`
146
+
147
+ ---
148
+
149
+ ### `cli/` — Client to the daemon
150
+
151
+ Click-based CLI and HTTP client. Everything here is a client to the server HTTP API.
152
+
153
+ **Owns:**
154
+ - `cli/main.py` — Click command tree
155
+ - `cli/client.py` — `RuntimeClient` (async HTTP client for daemon requests, attaches PoP JWT)
156
+ - `cli/client_config.py` — client-owned config (`active_identity`, `vault_id`, proxy settings)
157
+ - `cli/context.py` — `CliRuntime` wiring container
158
+ - `cli/daemon_control.py` — start/stop the daemon process
159
+
160
+ **Does not own:**
161
+ - Server registry operations
162
+ - Direct vault or store access
163
+ - Identity key generation (delegates to `identity/`, result stored by CLI via `identity/local.py`)
164
+
165
+ **Imported by:** nothing (entry point)
166
+
167
+ ---
168
+
169
+ ## Domain Language
170
+
171
+ ### Identity & Authentication
172
+
173
+ **Identity**: The cryptographic agent — Ed25519 key pair, `did:key` DID, and human-readable Handle. Created locally; registered with the daemon. Is not a credential namespace.
174
+
175
+ **Handle**: Human-readable name for an Identity (e.g., `brisk-boldly-clearly-1234`). Used as `sub` in PoP JWTs.
176
+
177
+ **DID**: `did:key` Ed25519 identifier derived from the Identity's public key. Used as `iss` in PoP JWTs.
178
+
179
+ **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
+
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.
182
+ _Avoid_: User, account, PrincipalHandle, profile
183
+
184
+ **PrincipalId**: Opaque stable identifier for a Principal. Never the email or handle — those can change; the PrincipalId cannot.
185
+ _Avoid_: principal_handle, principal_name, username
186
+
187
+ **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
+ _Avoid_: credential store, token store, secret store, profile store
189
+
190
+ **VaultId**: Opaque stable identifier for a Vault. Used as the storage key segment. Stable across naming changes.
191
+ _Avoid_: vault_name, vault_handle
192
+
193
+ **VaultHandle**: Human-readable name for a Vault (e.g., `default`). Used in UIs and CLI; the VaultId is authoritative in storage.
194
+
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.
196
+ _Avoid_: Claim, IdentityRegistration (as claim), join request
197
+
198
+ **ClaimStatus**: Lifecycle state: `pending` → `accepted` | `rejected`.
199
+
200
+ ---
201
+
202
+ ## Initialization & Claim Flow
203
+
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.
207
+
208
+ ---
209
+
210
+ ## Key Relationships
211
+
212
+ - An **Identity** is a cryptographic agent. It does not own credentials directly.
213
+ - An **Identity** claims a **Principal** via an **IdentityClaimRecord**. Claim must be `accepted` for vault access.
214
+ - A **Principal** owns one or more **Vaults** via **PrincipalVaultBindingRecords**. The server resolves the default Vault before constructing `AuthService`.
215
+ - A **Vault** contains zero or more **Connections**, each scoped to one **Provider**.
216
+ - Multiple Identities may share one Vault by claiming the same Principal.
217
+ - A **ConnectionRecord** belongs to exactly one Vault. `vault:<vault_id>:...` is the key prefix.
218
+ - **ClientCredentials** are server-scoped — one `ProviderClientRecord` per Provider, shared across all Vaults.
219
+
220
+ ---
221
+
222
+ ## AuthService Contract
223
+
224
+ `AuthService` is a per-request credential lifecycle object constructed by the server:
225
+
226
+ ```python
227
+ AuthService(vault=vault, identity=handle, principal_id=pid, vault_id=vid, deployment_mode=mode)
228
+ ```
229
+
230
+ - `identity` — agent Handle, used for audit logging only
231
+ - `principal_id` — resolved by `OwnershipResolver` from the PoP JWT subject
232
+ - `vault_id` — resolved from `PrincipalVaultBindingRegistry` by the server before constructing AuthService
233
+ - `vault` — the encrypted KV store; AuthService reads/writes only through this
234
+
235
+ AuthService does not query registries, does not know about server filesystem paths, and does not build proxy route catalogs.
236
+
237
+ ---
238
+
239
+ ## Audit Contract
240
+
241
+ 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
+
243
+ ---
244
+
245
+ ## Flagged Ambiguities
246
+
247
+ - **"PrincipalHandle"** — retired. The Principal is now identified by an opaque `PrincipalId`. Do not use PrincipalHandle in new code.
248
+ - **"VaultHandle"** — the human-readable display name. Do not use VaultHandle as a storage key; use VaultId.
249
+ - **"Claim"** — use `IdentityClaimRecord` for the binding object; use "claim" (lowercase) only as a verb.
250
+ - **"identity=server"** — a temporary hack in `app.py` where `AuthService` is instantiated at startup without a real identity. This is a known violation to be removed.
251
+ - **"credential"** — use **Connection** for the full authenticated session; use **access token** / **API key** for the individual secret.
@@ -33,6 +33,9 @@ Reach for a well-maintained dependency before writing your own crypto, HTTP clie
33
33
  **Deep modules over shallow ones.**
34
34
  Prefer a module with a small surface area and rich internals over a sprawl of thin wrappers. A single `AuthClient` that handles everything cleanly beats a dozen one-method classes. More files is not more modular.
35
35
 
36
+ **Composition over inheritance.**
37
+ Prefer small collaborators wired together through explicit dependencies over inheritance hierarchies. Use inheritance only when there is a real subtype relationship and composition would make the design less clear.
38
+
36
39
  **Single responsibility and separation of concerns.**
37
40
  Auth authenticates. Vault stores credentials. The CLI presents output. These boundaries are not negotiable — a flow should not write to storage, and storage should not know about OAuth. If a function is hard to name, it's doing too many things.
38
41
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: authsome
3
- Version: 0.3.2
3
+ Version: 0.4.1
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,6 +14,7 @@ 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: argon2-cffi>=25.1.0
17
18
  Requires-Dist: base58>=2.1.1
18
19
  Requires-Dist: click>=8.0
19
20
  Requires-Dist: cryptography>=41.0
@@ -205,6 +206,14 @@ npm i -g mint # requires Node.js >= 20.17.0
205
206
  mint dev
206
207
  ```
207
208
 
209
+ ## Telemetry
210
+
211
+ Authsome's daemon can emit product analytics through PostHog. You can disable telemetry with any of these environment variables:
212
+
213
+ - `DO_NOT_TRACK=1` disables analytics using the standard opt-out convention.
214
+ - `POSTHOG_DISABLED=1` disables analytics using PostHog's recommended kill switch.
215
+ - `AUTHSOME_ANALYTICS=0` disables analytics with an Authsome-specific override.
216
+
208
217
  ## Community
209
218
 
210
219
  - **[Discord](https://discord.gg/9YP2C9tvMp)** for questions, help, and showing what you're building.
@@ -165,6 +165,14 @@ npm i -g mint # requires Node.js >= 20.17.0
165
165
  mint dev
166
166
  ```
167
167
 
168
+ ## Telemetry
169
+
170
+ Authsome's daemon can emit product analytics through PostHog. You can disable telemetry with any of these environment variables:
171
+
172
+ - `DO_NOT_TRACK=1` disables analytics using the standard opt-out convention.
173
+ - `POSTHOG_DISABLED=1` disables analytics using PostHog's recommended kill switch.
174
+ - `AUTHSOME_ANALYTICS=0` disables analytics with an Authsome-specific override.
175
+
168
176
  ## Community
169
177
 
170
178
  - **[Discord](https://discord.gg/9YP2C9tvMp)** for questions, help, and showing what you're building.