authsome 0.2.3rc65__tar.gz → 0.2.3rc67__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 (195) hide show
  1. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/PKG-INFO +1 -1
  2. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/pyproject.toml +1 -1
  3. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/daemon_control.py +32 -4
  4. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/main.py +11 -4
  5. authsome-0.2.3rc67/src/authsome/server/routes/health.py +196 -0
  6. authsome-0.2.3rc65/src/authsome/server/routes/health.py +0 -70
  7. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  8. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  9. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/dependabot.yml +0 -0
  10. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/pull_request_template.md +0 -0
  11. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/release-please-config.json +0 -0
  12. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/release-please-manifest.json +0 -0
  13. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/pr-title.yml +0 -0
  14. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/publish-rc.yml +0 -0
  15. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/publish.yml +0 -0
  16. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/release-please.yml +0 -0
  17. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.github/workflows/test.yml +0 -0
  18. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.gitignore +0 -0
  19. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/.pre-commit-config.yaml +0 -0
  20. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/AGENTS.md +0 -0
  21. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CHANGELOG.md +0 -0
  22. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CLAUDE.md +0 -0
  23. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/CONTRIBUTING.md +0 -0
  24. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/LICENSE +0 -0
  25. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/README.md +0 -0
  26. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/UBIQUITOUS_LANGUAGE.md +0 -0
  27. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
  28. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/architecture.md +0 -0
  29. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/authsome-design.md +0 -0
  30. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/cli.md +0 -0
  31. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/manual-testing.md +0 -0
  32. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/providers.md +0 -0
  33. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/register-provider.md +0 -0
  34. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/security.md +0 -0
  35. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/README.md +0 -0
  36. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/architecture.mdx +0 -0
  37. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/credential-storage.mdx +0 -0
  38. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/provider-registry.mdx +0 -0
  39. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/concepts/proxy-injection.mdx +0 -0
  40. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/docs.json +0 -0
  41. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/custom-providers.mdx +0 -0
  42. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/headless-device-code.mdx +0 -0
  43. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/login-with-oauth.mdx +0 -0
  44. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/profiles.mdx +0 -0
  45. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
  46. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/guides/use-api-keys.mdx +0 -0
  47. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/index.mdx +0 -0
  48. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/quickstart.mdx +0 -0
  49. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/bundled-providers.mdx +0 -0
  50. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/cli.mdx +0 -0
  51. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/environment-variables.mdx +0 -0
  52. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/reference/provider-schema.mdx +0 -0
  53. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/doctor.mdx +0 -0
  54. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
  55. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
  56. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/site/troubleshooting/token-refresh.mdx +0 -0
  57. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/docs/specs/authsome-v1.md +0 -0
  58. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/refactoring.md +0 -0
  59. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/skills/authsome/SKILL.md +0 -0
  60. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/skills/authsome/evals/evals.json +0 -0
  61. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/__init__.py +0 -0
  62. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/audit/__init__.py +0 -0
  63. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/__init__.py +0 -0
  64. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/__init__.py +0 -0
  65. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
  66. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/apollo.json +0 -0
  67. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/ashby.json +0 -0
  68. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
  69. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
  70. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/brevo.json +0 -0
  71. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/buffer.json +0 -0
  72. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/calendly.json +0 -0
  73. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
  74. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/discord.json +0 -0
  75. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/dub.json +0 -0
  76. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/g2.json +0 -0
  77. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/github.json +0 -0
  78. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
  79. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/google.json +0 -0
  80. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
  81. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/hunter.json +0 -0
  82. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/instantly.json +0 -0
  83. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/intercom.json +0 -0
  84. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
  85. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
  86. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
  87. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
  88. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/linear.json +0 -0
  89. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
  90. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
  91. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
  92. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
  93. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/notion.json +0 -0
  94. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
  95. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/openai.json +0 -0
  96. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
  97. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/postiz.json +0 -0
  98. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/postmark.json +0 -0
  99. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/resend.json +0 -0
  100. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
  101. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
  102. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/semrush.json +0 -0
  103. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
  104. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/slack.json +0 -0
  105. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/tolt.json +0 -0
  106. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/typeform.json +0 -0
  107. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/wistia.json +0 -0
  108. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/x.json +0 -0
  109. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/bundled_providers/zapier.json +0 -0
  110. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/__init__.py +0 -0
  111. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/api_key.py +0 -0
  112. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/base.py +0 -0
  113. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/dcr_pkce.py +0 -0
  114. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/device_code.py +0 -0
  115. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/flows/pkce.py +0 -0
  116. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/input_provider.py +0 -0
  117. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/__init__.py +0 -0
  118. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/config.py +0 -0
  119. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/connection.py +0 -0
  120. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/enums.py +0 -0
  121. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/profile.py +0 -0
  122. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/models/provider.py +0 -0
  123. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/providers/__init__.py +0 -0
  124. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/providers/registry.py +0 -0
  125. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/service.py +0 -0
  126. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/auth/sessions.py +0 -0
  127. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/__init__.py +0 -0
  128. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/cli/client.py +0 -0
  129. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/errors.py +0 -0
  130. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/identity/__init__.py +0 -0
  131. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/__init__.py +0 -0
  132. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/router.py +0 -0
  133. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/runner.py +0 -0
  134. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/proxy/server.py +0 -0
  135. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/py.typed +0 -0
  136. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/__init__.py +0 -0
  137. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/app.py +0 -0
  138. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/daemon.py +0 -0
  139. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/dependencies.py +0 -0
  140. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/__init__.py +0 -0
  141. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/_deps.py +0 -0
  142. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/auth.py +0 -0
  143. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/connections.py +0 -0
  144. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/providers.py +0 -0
  145. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/proxy.py +0 -0
  146. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/routes/ui.py +0 -0
  147. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/schemas.py +0 -0
  148. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/__init__.py +0 -0
  149. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/pages.py +0 -0
  150. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/ui/web_theme.py +0 -0
  151. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/server/urls.py +0 -0
  152. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/__init__.py +0 -0
  153. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/interfaces.py +0 -0
  154. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/store/local.py +0 -0
  155. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/__init__.py +0 -0
  156. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/static/app.js +0 -0
  157. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/static/style.css +0 -0
  158. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/_app_detail_shell.html +0 -0
  159. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/_layout.html +0 -0
  160. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_apikey.html +0 -0
  161. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_disconnected.html +0 -0
  162. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/app_detail_oauth.html +0 -0
  163. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/connections.html +0 -0
  164. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/ui/templates/overview.html +0 -0
  165. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/utils.py +0 -0
  166. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/vault/__init__.py +0 -0
  167. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/src/authsome/vault/crypto.py +0 -0
  168. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/__init__.py +0 -0
  169. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/__init__.py +0 -0
  170. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_flows.py +0 -0
  171. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_models.py +0 -0
  172. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/auth/test_url_template.py +0 -0
  173. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/__init__.py +0 -0
  174. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/conftest.py +0 -0
  175. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_daemon.py +0 -0
  176. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_get.py +0 -0
  177. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_helpers.py +0 -0
  178. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_list.py +0 -0
  179. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_login.py +0 -0
  180. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_logout.py +0 -0
  181. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_register.py +0 -0
  182. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_revoke.py +0 -0
  183. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/cli/test_whoami.py +0 -0
  184. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/__init__.py +0 -0
  185. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_audit.py +0 -0
  186. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_errors.py +0 -0
  187. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_logging.py +0 -0
  188. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/common/test_utils.py +0 -0
  189. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/conftest.py +0 -0
  190. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/proxy/__init__.py +0 -0
  191. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/proxy/test_proxy.py +0 -0
  192. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/__init__.py +0 -0
  193. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/test_crypto.py +0 -0
  194. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/tests/vault/test_store.py +0 -0
  195. {authsome-0.2.3rc65 → authsome-0.2.3rc67}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: authsome
3
- Version: 0.2.3rc65
3
+ Version: 0.2.3rc67
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "authsome"
7
- version = "0.2.3rc65"
7
+ version = "0.2.3rc67"
8
8
  description = "A portable local authentication library for AI agents and developer tools"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -35,8 +35,7 @@ def ensure_daemon() -> AuthsomeApiClient:
35
35
  client = AuthsomeApiClient(DEFAULT_DAEMON_URL)
36
36
  if _is_ready(client):
37
37
  return client
38
- if _pid_file_process_alive():
39
- stop_daemon()
38
+ stop_daemon()
40
39
  start_daemon()
41
40
  deadline = time.monotonic() + 10
42
41
  while time.monotonic() < deadline:
@@ -71,7 +70,17 @@ def start_daemon() -> None:
71
70
 
72
71
 
73
72
  def stop_daemon() -> None:
74
- pid = _read_pid()
73
+ pid = None
74
+ client = AuthsomeApiClient(DEFAULT_DAEMON_URL)
75
+ try:
76
+ health_data = client.health()
77
+ pid = health_data.get("pid")
78
+ except Exception:
79
+ pass
80
+
81
+ if pid is None:
82
+ pid = _read_pid()
83
+
75
84
  if pid is None:
76
85
  return
77
86
  try:
@@ -104,7 +113,26 @@ def daemon_status() -> dict[str, Any]:
104
113
 
105
114
  def _is_ready(client: AuthsomeApiClient) -> bool:
106
115
  try:
107
- return client.health().get("status") == "ok" and client.ready().get("status") == "ready"
116
+ health = client.health()
117
+ from authsome import __version__
118
+
119
+ if health.get("version") != __version__:
120
+ return False
121
+
122
+ # If we are in local development, auto-restart the daemon if any code file changes.
123
+ if STATE_FILE.exists():
124
+ daemon_start_time = STATE_FILE.stat().st_mtime
125
+ src_dir = Path(__file__).parent.parent
126
+ for path in src_dir.glob("**/*"):
127
+ if path.is_file() and not any(part.startswith("__") or part == ".pytest_cache" for part in path.parts):
128
+ if path.suffix in (".py", ".json", ".html", ".css", ".js"):
129
+ if path.stat().st_mtime > daemon_start_time:
130
+ return False
131
+
132
+ if health.get("status") != "ok":
133
+ return False
134
+ client.ready()
135
+ return True
108
136
  except Exception:
109
137
  return False
110
138
 
@@ -899,14 +899,21 @@ def doctor(ctx_obj: ContextObj) -> None:
899
899
  else:
900
900
  all_ok = results.get("status") == "ready"
901
901
  for key, val in results.get("checks", {}).items():
902
- ok = val == "ok"
903
902
  ctx_obj.echo(f"{key}: ", nl=False)
904
- ctx_obj.echo("OK" if ok else "FAIL", color="green" if ok else "red")
903
+ if val == "ok":
904
+ ctx_obj.echo("OK", color="green")
905
+ elif val == "warn":
906
+ ctx_obj.echo("WARN", color="yellow")
907
+ else:
908
+ ctx_obj.echo("FAIL", color="red")
905
909
  issues = results.get("issues", [])
906
910
  if issues:
907
- ctx_obj.echo("\nIssues found:", color="red")
911
+ ctx_obj.echo("\nIssues/warnings found:")
908
912
  for issue in issues:
909
- ctx_obj.echo(f" - {issue}", color="red")
913
+ if issue.startswith("warning:"):
914
+ ctx_obj.echo(f" - {issue}", color="yellow")
915
+ else:
916
+ ctx_obj.echo(f" - {issue}", color="red")
910
917
 
911
918
  if not all_ok:
912
919
  sys.exit(1)
@@ -0,0 +1,196 @@
1
+ """Health and readiness routes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+
7
+ from fastapi import APIRouter, Depends
8
+
9
+ from authsome import __version__
10
+ from authsome.auth import AuthService
11
+ from authsome.server.routes._deps import get_auth_service
12
+ from authsome.server.schemas import HealthResponse, ReadyResponse
13
+
14
+ router = APIRouter()
15
+
16
+
17
+ @router.get("/health", response_model=HealthResponse)
18
+ def health() -> HealthResponse:
19
+ return HealthResponse(status="ok", version=__version__, pid=os.getpid())
20
+
21
+
22
+ def _check_config(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
23
+ try:
24
+ config = auth.app_store.get_config()
25
+ checks["config"] = "ok" if config else "ok"
26
+ except Exception as exc:
27
+ checks["config"] = "failed"
28
+ issues.append(f"config: {exc}")
29
+
30
+
31
+ def _check_providers(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
32
+ try:
33
+ auth.list_providers()
34
+ checks["providers"] = "ok"
35
+ except Exception as exc:
36
+ checks["providers"] = "failed"
37
+ issues.append(f"providers: {exc}")
38
+
39
+
40
+ def _check_vault(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
41
+ try:
42
+ auth.vault.put("__ready_test__", "ok", profile=auth.identity)
43
+ value = auth.vault.get("__ready_test__", profile=auth.identity)
44
+ auth.vault.delete("__ready_test__", profile=auth.identity)
45
+ checks["vault"] = "ok" if value == "ok" else "failed"
46
+ if value != "ok":
47
+ issues.append("vault: readiness roundtrip failed")
48
+ except Exception as exc:
49
+ checks["vault"] = "failed"
50
+ issues.append(f"vault: {exc}")
51
+
52
+
53
+ def _check_permissions(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
54
+ try:
55
+ if os.name != "nt":
56
+ master_key_path = auth.app_store.home / "master.key"
57
+ if master_key_path.exists():
58
+ mode = master_key_path.stat().st_mode
59
+ if (mode & 0o077) != 0:
60
+ checks["permissions"] = "failed"
61
+ issues.append(
62
+ f"permissions: master.key has insecure permissions {oct(mode & 0o777)} (expected 0600)"
63
+ )
64
+
65
+ db_path = auth.app_store.home / "profiles" / auth.identity / "store.db"
66
+ if db_path.exists():
67
+ mode = db_path.stat().st_mode
68
+ if (mode & 0o077) != 0:
69
+ checks["permissions"] = "failed"
70
+ issues.append(f"permissions: store.db has insecure permissions {oct(mode & 0o777)} (expected 0600)")
71
+
72
+ if "permissions" not in checks:
73
+ checks["permissions"] = "ok"
74
+ else:
75
+ checks["permissions"] = "ok"
76
+ except Exception as exc:
77
+ checks["permissions"] = "failed"
78
+ issues.append(f"permissions: {exc}")
79
+
80
+
81
+ def _check_profiles(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
82
+ try:
83
+ auth.app_store.list_profiles()
84
+ checks["profiles"] = "ok"
85
+ except Exception as exc:
86
+ checks["profiles"] = "failed"
87
+ issues.append(f"profiles: {exc}")
88
+
89
+
90
+ def _check_connections(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
91
+ try:
92
+ connections = auth.list_connections()
93
+ has_active = any(conn.get("status") == "connected" for p in connections for conn in p.get("connections", []))
94
+ checks["connections"] = "ok"
95
+ if not has_active:
96
+ issues.append("warning: No providers have active connections")
97
+ except Exception as exc:
98
+ checks["connections"] = "failed"
99
+ issues.append(f"connections: {exc}")
100
+
101
+
102
+ def _check_key_age(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
103
+ try:
104
+ master_key_path = auth.app_store.home / "master.key"
105
+ if master_key_path.exists():
106
+ from datetime import UTC, datetime
107
+
108
+ from authsome.utils import utc_now
109
+
110
+ mtime = datetime.fromtimestamp(master_key_path.stat().st_mtime, tz=UTC)
111
+ age_days = (utc_now() - mtime).days
112
+ if age_days > 90:
113
+ checks["key_age"] = "warn"
114
+ issues.append(f"warning: master.key has not been rotated in >90 days (age: {age_days} days)")
115
+ else:
116
+ checks["key_age"] = "ok"
117
+ else:
118
+ checks["key_age"] = "ok"
119
+ except Exception as exc:
120
+ checks["key_age"] = "failed"
121
+ issues.append(f"key_age: {exc}")
122
+
123
+
124
+ def _check_integrity(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
125
+ try:
126
+ import sqlite3
127
+
128
+ db_path = auth.app_store.home / "profiles" / auth.identity / "store.db"
129
+ if db_path.exists():
130
+ conn = sqlite3.connect(str(db_path))
131
+ try:
132
+ cursor = conn.execute("PRAGMA integrity_check;")
133
+ result = cursor.fetchone()
134
+ if result and result[0] == "ok":
135
+ checks["integrity"] = "ok"
136
+ else:
137
+ checks["integrity"] = "failed"
138
+ issues.append(f"integrity: PRAGMA integrity_check failed on store.db: {result}")
139
+ finally:
140
+ conn.close()
141
+ else:
142
+ checks["integrity"] = "ok"
143
+ except Exception as exc:
144
+ checks["integrity"] = "failed"
145
+ issues.append(f"integrity: {exc}")
146
+
147
+
148
+ def _check_version_compatibility(auth: AuthService, checks: dict[str, str], issues: list[str]) -> None:
149
+ try:
150
+ checks["version_compatibility"] = "ok"
151
+ version_path = auth.app_store.home / "version"
152
+ if version_path.exists():
153
+ v = version_path.read_text(encoding="utf-8").strip()
154
+ if v != "2":
155
+ checks["version_compatibility"] = "failed"
156
+ issues.append(f"version_compatibility: Home version is {v} but expected 2")
157
+ except Exception as exc:
158
+ checks["version_compatibility"] = "failed"
159
+ issues.append(f"version_compatibility: {exc}")
160
+
161
+
162
+ @router.get("/ready", response_model=ReadyResponse)
163
+ def ready(auth: AuthService = Depends(get_auth_service)) -> ReadyResponse:
164
+ checks: dict[str, str] = {}
165
+ issues: list[str] = []
166
+
167
+ _check_config(auth, checks, issues)
168
+ _check_providers(auth, checks, issues)
169
+ _check_vault(auth, checks, issues)
170
+ _check_permissions(auth, checks, issues)
171
+ _check_profiles(auth, checks, issues)
172
+ _check_connections(auth, checks, issues)
173
+ _check_key_age(auth, checks, issues)
174
+ _check_integrity(auth, checks, issues)
175
+ _check_version_compatibility(auth, checks, issues)
176
+
177
+ has_critical_failures = any(not issue.startswith("warning:") for issue in issues)
178
+ return ReadyResponse(status="ready" if not has_critical_failures else "not_ready", checks=checks, issues=issues)
179
+
180
+
181
+ @router.get("/whoami")
182
+ def whoami(auth: AuthService = Depends(get_auth_service)) -> dict[str, str]:
183
+ config = auth.app_store.get_config()
184
+ enc_mode = config.encryption.mode if config.encryption else "local_key"
185
+ if enc_mode == "local_key":
186
+ enc_desc = f"Local Key ({auth.app_store.home / 'master.key'})"
187
+ elif enc_mode == "keyring":
188
+ enc_desc = "OS Keyring"
189
+ else:
190
+ enc_desc = enc_mode
191
+ return {
192
+ "version": __version__,
193
+ "home": str(auth.app_store.home),
194
+ "active_identity": auth.identity,
195
+ "encryption_backend": enc_desc,
196
+ }
@@ -1,70 +0,0 @@
1
- """Health and readiness routes."""
2
-
3
- from __future__ import annotations
4
-
5
- import os
6
-
7
- from fastapi import APIRouter, Depends
8
-
9
- from authsome import __version__
10
- from authsome.auth import AuthService
11
- from authsome.server.routes._deps import get_auth_service
12
- from authsome.server.schemas import HealthResponse, ReadyResponse
13
-
14
- router = APIRouter()
15
-
16
-
17
- @router.get("/health", response_model=HealthResponse)
18
- def health() -> HealthResponse:
19
- return HealthResponse(status="ok", version=__version__, pid=os.getpid())
20
-
21
-
22
- @router.get("/ready", response_model=ReadyResponse)
23
- def ready(auth: AuthService = Depends(get_auth_service)) -> ReadyResponse:
24
- checks: dict[str, str] = {}
25
- issues: list[str] = []
26
-
27
- try:
28
- config = auth.app_store.get_config()
29
- checks["config"] = "ok" if config else "ok"
30
- except Exception as exc:
31
- checks["config"] = "failed"
32
- issues.append(f"config: {exc}")
33
-
34
- try:
35
- auth.list_providers()
36
- checks["providers"] = "ok"
37
- except Exception as exc:
38
- checks["providers"] = "failed"
39
- issues.append(f"providers: {exc}")
40
-
41
- try:
42
- auth.vault.put("__ready_test__", "ok", profile=auth.identity)
43
- value = auth.vault.get("__ready_test__", profile=auth.identity)
44
- auth.vault.delete("__ready_test__", profile=auth.identity)
45
- checks["vault"] = "ok" if value == "ok" else "failed"
46
- if value != "ok":
47
- issues.append("vault: readiness roundtrip failed")
48
- except Exception as exc:
49
- checks["vault"] = "failed"
50
- issues.append(f"vault: {exc}")
51
-
52
- return ReadyResponse(status="ready" if not issues else "not_ready", checks=checks, issues=issues)
53
-
54
-
55
- @router.get("/whoami")
56
- def whoami(auth: AuthService = Depends(get_auth_service)) -> dict[str, str]:
57
- config = auth.app_store.get_config()
58
- enc_mode = config.encryption.mode if config.encryption else "local_key"
59
- if enc_mode == "local_key":
60
- enc_desc = f"Local Key ({auth.app_store.home / 'master.key'})"
61
- elif enc_mode == "keyring":
62
- enc_desc = "OS Keyring"
63
- else:
64
- enc_desc = enc_mode
65
- return {
66
- "version": __version__,
67
- "home": str(auth.app_store.home),
68
- "active_identity": auth.identity,
69
- "encryption_backend": enc_desc,
70
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes